struct Struct1 {
let myLet = "my let"
let myLet2: Bool
let myLet3: String
}
let s1 = Struct1(myLet2: false, myLet3: "My url123")
Ошибка: отсутствующий аргумент для параметра myLet
. Почему это? Он имеет значение по умолчанию.
struct Struct1 {
let myLet = "my let"
let myLet2: Bool
let myLet3: String
}
let s1 = Struct1(myLet2: false, myLet3: "My url123")
Ошибка: отсутствующий аргумент для параметра myLet
. Почему это? Он имеет значение по умолчанию.
Инициализация по умолчанию - это все или ничего для Struct. Либо вы определяете значения по умолчанию для всех свойств, и получаете автоматически сгенерированный инициализатор Struct1()
плюс инициализатор со всеми свойствами, или вы получаете только инициализатор со всеми свойствами, включая все, что имеет установленное значение по умолчанию. Вам придется реализовать пользовательский инициализатор.
struct Struct1 {
let myLet = "my let"
let myLet2: Bool
let myLet3: String
init(myLet2: Bool, myLet3: String) {
self.myLet2 = myLet2
self.myLet3 = myLet3
}
}
В быстрой 4
struct Struct1 {
let myLet: String?
let myLet2: Bool
let myLet3: String
init(myLet: String? = nil, myLet2: Bool, myLet3: String) {
self.myLet = myLet
self.myLet2 = myLet2
self.myLet3 = myLet3
}
}
Swift 5.1: поведение при инициализации по элементам struct
изменяется в Swift 5.1 (поставляется с Xcode 11), чтобы вести себя больше, чем вы ожидаете:
struct Struct1 {
var myVar = "my var"
let myLet2: Bool
let myLet3: String
}
// Swift 5.1 generates a memberwise init as:
// init(myVar: String = "my var", myLet2: Bool, myLet3: String)
поэтому следующий код теперь будет работать в Swift 5.1:
let s1 = Struct1(myLet2: false, myLet3: "My url123")
let s2 = Struct1(myVar: "var1", myLet2: false, myLet3: "My url123")
Подробнее см. в соответствующем предложении Swift Evolution.