Подклассификация vs. протоколы
Начнем с подхода Class
:
class LoginCredentials {
var id : String
init(userID:String) {
self.id = userID
}
}
мы получим следующее:
class FacebookLoginCredentials : LoginCredentials {
var token : String
init(userID:String,userToken:String) {
self.token = userToken
super.init(userID: userID)
}}
и
class TwitterLoginCredentials : LoginCredentials {
var token : String
var secret : String
init(userID:String,userToken:String,secret : String) {
self.token = userToken
self.secret = secret
super.init(userID: userID)
}
}
Второй подход - это Protocol Oriented
, если я не ошибаюсь
protocol LoginCredentials {
var id : String { get }
}
то мы будем иметь:
struct FacebookLoginCredentials : LoginCredentials {
var id: String
var token : String
init(userID:String,userToken:String) {
self.id = userID
self.token = userToken
}
}
и
struct TwitterLoginProfile : LoginCredentials {
var id: String
var token : String
var secret : String
init(userID:String,userToken:String,secret : String) {
self.token = userToken
self.secret = secret
self.id = userID
}
}
Мне просто нужно знать, какая из них более Swift?
Ответы
Ответ 1
В конечном счете, ни один из этих подходов не является "более быстрым". В Swift вы иногда захотите использовать наследование и другие времена, когда вы захотите использовать протоколы. Реальная точка принятия решения для этих двух подходов:
Вам нужна семантика типа значения (структуры и протоколы) или вам нужна семантика ссылочного типа (классы и протоколы). Обычно я использую семантику типа значения по умолчанию, потому что они более безопасны, но есть определенные обстоятельства, когда важна семантика ссылочного типа. Вы можете узнать больше об этом здесь: Зачем выбирать структуру над классом.
Ответ 2
Либо или допустимо в быстром режиме.
Вот как вы хотите отличить от двух.
При работе с протоколами вы хотите обрабатывать их так, как если бы они были синими отпечатками для ваших объектов.
Ballplayers must know what a ball is, so any person that wants to be a Ballplayer must know what a ball is.
У вас есть набор правил, которым нужно следовать определенным объектам, сделать протокол.
Если вы хотите создавать объекты, которые имеют функциональные возможности, и вы хотите, чтобы дети были неотъемлемы этой функциональностью, а затем имеют больше функциональности, тогда создайте структуру классов inheret.
Dad can throw a ball at 100MPH
Junior can throw a ball at 100MPH and throw a curve ball.
Это будет сделано с классом, а не с протоколом
Ответ 3
Строковые экземпляры всегда передаются по значению, а экземпляры классов всегда передаются по ссылке. Это означает, что они подходят для различных задач. Поскольку вы рассматриваете конструкции данных и функциональные возможности, необходимые для проекта, решайте, должна ли каждая конструкция данных быть определена как класс или как структура.
В качестве общего руководства рассмотрите вопрос о создании структуры при применении одного или нескольких из этих условий:
Основной целью структур является инкапсуляция нескольких относительно простых значений данных.
Разумно ожидать, что инкапсулированные значения будут скопированы, а не будут указаны при назначении или передаче экземпляра этой структуры.
Любые свойства, хранящиеся в структуре, сами являются типами значений, которые также следует скопировать, а не ссылаться.
Структуре не нужно наследовать свойства или поведение другого существующего типа.
Примеры хороших кандидатов для структур включают:
- Размер геометрической формы, возможно, инкапсулирует свойство width и свойство height, оба типа Double.
- Способ ссылаться на диапазоны внутри серии, возможно, инкапсулируя свойство start и свойство length, как типа Int.
- Точка в трехмерной системе координат, возможно, инкапсулирующая свойства x, y и z, каждый из которых является двойным.
Во всех остальных случаях определите класс и создайте экземпляры этого класса для управления и передачи по ссылке. На практике это означает, что большинство пользовательских конструктов данных должны быть классами, а не структурами.
Зачем выбирать класс над классом?