Не удается инициализировать структуру со значением по умолчанию

struct Struct1 {
  let myLet = "my let"
  let myLet2: Bool
  let myLet3: String
}

let s1 = Struct1(myLet2: false, myLet3: "My url123")

Ошибка: отсутствующий аргумент для параметра myLet. Почему это? Он имеет значение по умолчанию.

Ответ 1

Инициализация по умолчанию - это все или ничего для 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
    }
}

Ответ 2

В быстрой 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
    }
}

Ответ 3

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.