Подклассификация 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, каждый из которых является двойным.

Во всех остальных случаях определите класс и создайте экземпляры этого класса для управления и передачи по ссылке. На практике это означает, что большинство пользовательских конструктов данных должны быть классами, а не структурами.

Зачем выбирать класс над классом?