我理解
var perhapsInt : Int?
这会自动设置为.None
值。以下代码片段确认(无编译器错误)
class MyClass {
var num1: Int = 0
var num2: Int?
init(num1: Int) {
self.num1 = num1
}
}
var newClass = MyClass(num1: 5)
newClass.num1 // prints '5'
newClass.num2 // prints 'nil'
我对可选的初始化过程的理解是否正确?如果是这样,当我将num2
更改为let
时,为什么这不起作用。
在使用nil
时,我预计选项会默认为let
的行为相同。我在这里错过了什么吗?
class MyClass {
var num1: Int = 0
let num2: Int?
init(num1: Int) {
self.num1 = num1
// compiler error : return from initialiser without initialising all stored properties
}
}
...
我的问题是,这两种情况如何都是真的。不应该是一个或另一个。可选值会自动设置为.None
,也可能不会。
答案 0 :(得分:5)
var num2: Int?
的行为是由Optional
由糖动力引起的。它们是Swift中唯一具有隐含默认值(.None
)的类型。
请注意,如果您键入var num2: Int
(不带?
) - 编译器将抛出相同的错误,无论使用var
还是let
。
class MyClass {
var num2: Int
init() {
// Return from initializer without initializing all stored properties
}
}
由于无法覆盖let
s'值(而不是var
s'),因此需要明确设置其初始值:
class MyClass {
let num2: Int? = nil
}
// or this way
class MyClass {
let num2: Int?
init() {
num2 = nil
}
}
然而,这将导致无用的nil
常数。
答案 1 :(得分:0)
我认为很多讨论都是here。 来自该主题的声明 - 深入了解上述链接
在编译时不需要知道常量的值,但是 你必须给它一个值一次。
如果您将let值设置为:
,则可以编译代码let num2: Int? = .None
let num2: Int? = nil