为什么我需要在Struct-Swift中明确声明一个可选值为nil

Log*_*gan 9 swift

以下是文档的引用:

如果您的自定义类型具有逻辑上允许具有"无值"的存储属性 - 可能因为在初始化期间无法设置其值,或者因为在稍后的某个时间点允许它具有"无值" - 请使用可选类型.可选类型的属性将自动初始化,值为nil,表示该属性在初始化期间故意具有"无值".

如果我用一个类来做这件事就可以了:

class MyClass {
    var someProperty: String?
}

var myClass = MyClass()
myClass.someProperty // Shows nil
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用结构类型执行此操作,则会在初始化时出错:

struct MyStruct {
    var someProperty: String?
}

// ERROR
var myStruct = MyStruct()
Run Code Online (Sandbox Code Playgroud)

错误:

缺少参数'someProperty'的参数

我可以通过明确地声明它来解决这个问题:

struct MyStruct {
    var someProperty: String? = nil
}

// Valid
var myStruct = MyStruct()
Run Code Online (Sandbox Code Playgroud)

鉴于文档,我希望任何类型的属性作为选项被默认为nil.有没有理由我必须在结构上明确声明它?

为什么?

没有什么好理由,就像很多人一样,我只是在试验.

Cez*_*zar 12

Classes和Structs都需要在初始化时设置所有属性值.这可以通过显式默认值或通过在指定的初始值设定项中设置值来完成.

但是,Structs的不同之处在于它们具有自动生成的成员初始化程序.

如果没有someProperty显式定义值,则struct只有一个初始值设定项:自动生成的成员值.

如果确实提供了默认值,则会得到两个:一个不带参数,一个带值someProperty作为参数

来自文档:

所有结构都有一个自动生成的成员初始化程序,您可以使用它初始化新结构实例的成员属性.可以通过名称将新实例的属性的初始值传递给成员初始值设定项:

let vga = Resolution(width: 640, height: 480)
Run Code Online (Sandbox Code Playgroud)

与结构不同,类实例不接收默认的成员初始值设定项.初始化器在初始化中有更详细的描述.