Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要在Struct-Swift中显式地将可选值声明为nil_Swift - Fatal编程技术网

为什么我需要在Struct-Swift中显式地将可选值声明为nil

为什么我需要在Struct-Swift中显式地将可选值声明为nil,swift,Swift,以下是文档中的引用: 如果自定义类型的存储属性在逻辑上允许为“无值”-可能是因为在初始化过程中无法设置其值,或者是因为在以后某个时候允许其为“无值”,请使用可选类型声明该属性。可选类型的属性将使用值nil自动初始化,这表明该属性有意在初始化期间“还没有值” 如果我在课堂上这样做,效果很好: class MyClass { var someProperty: String? } var myClass = MyClass() myClass.someProperty // Shows n

以下是文档中的引用:

如果自定义类型的存储属性在逻辑上允许为“无值”-可能是因为在初始化过程中无法设置其值,或者是因为在以后某个时候允许其为“无值”,请使用可选类型声明该属性。可选类型的属性将使用值nil自动初始化,这表明该属性有意在初始化期间“还没有值”

如果我在课堂上这样做,效果很好:

class MyClass {
    var someProperty: String?
}

var myClass = MyClass()
myClass.someProperty // Shows nil
但是,如果使用结构类型执行此操作,则在初始化时会出现错误:

struct MyStruct {
    var someProperty: String?
}

// ERROR
var myStruct = MyStruct()
错误:

参数“someProperty”缺少参数

我可以通过明确声明它为零来纠正这一点,如下所示:

struct MyStruct {
    var someProperty: String? = nil
}

// Valid
var myStruct = MyStruct()
问题: 根据文档,我希望设置为optionals的任何类型的属性都默认为nil。我必须在结构上显式声明它有什么原因吗

为什么?


没有什么好的理由,就像你们中的许多人一样,我只是在试验。

我认为这是结构和类之间有意的区别,这有点道理。例如,当您有一个结构时,假设一个三维点具有XYZ的三个浮点数。x、y或z的值为零没有多大意义。另一方面,对于类来说,这是一个非常重要的特性。例如,如果您考虑一个downloader类,它将下载一个文本文件并将其存储在属性中。当类首次初始化时,该属性为nil更有意义。由于苹果已经改变了结构,使其与类的关系更加密切,我认为这是一个重要的区别。我认为将optional显式设置为nil是一个错误


我的理由是:


在本例中,所有示例都是关于类的

初始化类和结构时,都需要设置所有属性值。这可以通过显式默认值或通过在指定的初始值设定项中设置值来实现

但是,结构的不同之处在于,它们有一个自动生成的成员初始值设定项

如果不明确定义
someProperty
的值,则结构只有一个初始值设定项:自动生成的memberwise初始值设定项

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

从文档中:

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

与结构不同,类实例不接收默认的memberwise 初始化器。有关初始值设定项的详细信息,请参见 初始化


我同意这是相当奇怪的(除非我也遗漏了什么)。对于只有选项的结构,可能值得建议(通过Apple bugreport),在这种情况下,默认情况下也会添加默认的无参数初始化器

另一个补救办法是

var myStruct = MyStruct(someProperty:nil)

但是,如果您有很多可选成员,这将变得笨拙。

ahhh,是的。这是有道理的。谢谢
var myStruct = MyStruct(someProperty:nil)