无法使用默认值初始化结构

19 macos ios swift

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

let s1 = Struct1(myLet2: false, myLet3: "My url123")
Run Code Online (Sandbox Code Playgroud)

错误是:缺少参数参数myLet.这是为什么?它有一个默认值.

kel*_*ket 20

对于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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不确定我是否理解,如何自动获取`Struct1()`初始化程序以及具有所有属性的初始化程序? (2认同)
  • Swift 5.1 不再是这种情况,在初始化结构时,您不需要为具有默认值的结构属性提供值 - https://github.com/apple/swift-evolution/blob/master /proposals/0242-default-values-memberwise.md。 (2认同)

Yll*_*low 6

迅速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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这与Swift 4并没有特别的关系。自Swift 1.0起,就可以在初始化程序中声明默认值。 (4认同)
  • 只是为了清楚起见,在此示例中写了一个快速版本的注释 (4认同)

Nic*_*ger 6

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)
Run Code Online (Sandbox Code Playgroud)

因此以下代码现在可以在Swift 5.1中运行:

let s1 = Struct1(myLet2: false, myLet3: "My url123") 
let s2 = Struct1(myVar: "var1", myLet2: false, myLet3: "My url123")
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见相关的Swift进化建议

  • 你的例子是错误的。为了让编译器用默认值合成 init,您必须将这些值声明为“var”。否则,这些值是不可变的,一旦您使用赋值 `let myLet = "my let"` 初始化它们,您将无法再修改它们。 (2认同)
  • @superpuccio我的错误我已经编辑了答案,将struct中的默认值从`let`更改为`var`-感谢指出我的错误。 (2认同)