2016-08-24 7 views
1

У меня есть протокол, который описывает морской параметр воды, который нуждается в испытываться:Почему значения свойств по умолчанию все еще отображаются как параметры в Init()?

protocol Parameter { 

    var name: String { get } 
    var unit: Unit { get } 
    var value: Double { get } 

} 

У меня есть-структуру Calcium, который соответствует Parameter:

struct Calcium: Parameter { 

    var name: String = "Calcium" 
    var unit: Unit = UnitDispersion.partsPerMillion 
    var value: Double 

} 

Так как name и unit параметров Calcium имеют значения по умолчанию, почему я должен предоставить их в методе init? Разве мне не нужно указывать только значение value?

Я пытаюсь понять протокол-ориентированное программирование и действительно оценил бы небольшое руководство здесь.

enter image description here

ответ

5
  1. Это не имеет ничего общего с протоколами.

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

Если вам не нравится, что пишут инициализатор сами:

struct Calcium: Parameter { 
    var name: String = "Calcium" 
    var unit: Unit = UnitDispersion.partsPerMillion 
    var value: Double 
    init(value:Double) {self.value = value} 
} 

Теперь это законно сказать:

let c = Calcium(value:2) 
+1

Что касается следующего очевидный вопрос «почему Безразлично» t Swift ... "см. https://github.com/apple/swift-evolution/blob/master/proposals/0018-flexible-memberwise-initialization.md, в котором обсуждаются оба предложения по изменению этого поведения и ссылки на обоснование того, почему это до сих пор не изменилось. –

+0

@RobNapier Прохладный, спасибо, что добавил. Поэтому мы могли бы назвать это «интеллектуальным инициализатором по порядку» ... :) – matt

+0

Итак, если у меня есть, скажем, еще 20 структурных параметров воды, которые соответствуют протоколу Parameter, мне все равно нужно реализовать один и тот же инициализатор для каждой структуры? Это что-то, что можно добавить в расширение протокола, или мне было бы лучше просто добавить этот инициализатор в протокол и потребовать, чтобы он был реализован всем, что соответствует протоколу Parameter? –

 Смежные вопросы

  • Нет связанных вопросов^_^