Swift 可选初始化

Swift optional initialisation

据我了解

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 时这不起作用。

我期望在使用 let 时选项默认为 nil 的相同行为。我在这里遗漏了什么吗?

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,要么不是。

我认为很多讨论是here。 来自该线程的声明 - 在上面的 link

中深入了解

The value of a constant doesn’t need to be known at compile time, but you must assign it a value exactly once.

有趣的是,如果您设置如下 let 值,您的代码将编译:

let num2: Int? = .None
let num2: Int? = nil

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
    }
}

因为 lets 的值无法被覆盖(与 vars' 相反),它们需要您 明确地 设置它们的初始值:

class MyClass {
    let num2: Int? = nil
}

// or this way

class MyClass {
    let num2: Int?
    init() {
        num2 = nil
    }
}

然而,这将导致无用的 nil 常量。


您可以阅读有关存储属性初始化的更多信息here and here