«init» в протоколах Swift - зачем? - PullRequest
1 голос
/ 07 января 2020

Не могли бы вы объяснить, почему можно включить инициализатор в протокол Swift? Я думал, что ответственность за протоколы состоит в том, чтобы определить, на что способна конкретная реализация, без уточнения деталей реализации. Разве инициализатор не такая вещь?

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Вот очень надуманный пример:

protocol P {
    init(a: Int)
}

class B: P {
    let a: Int
    required init(a: Int) {
        self.a = a
    }
}

func factory<T: P>(a: Int) -> T {
    return T(a: a)
}

let b: B = factory(a: 1)

Позволяя протоколу (P) указать требуемый инициализатор, я могу написать функцию factory, которая должна создавать новые объекты.

Инициатива не говорит о том, что вы делаете с Int, который передается - просто что можно сделать P конкретные значения из Int.

2 голосов
/ 07 января 2020

Иногда вы действительно хотите, чтобы протокол явно указывал, что тип поддерживает определенный тип инициализатора. На самом деле в стандартной библиотеке есть несколько из них, и полезно, чтобы некоторые из ваших собственных типов соответствовали им. Например, ExpressibleByArrayLiteral . Этот протокол является причиной, по которой вы можете инициировать Set с литералом массива, таким как [1,2,3]

...