5

这是我的理解

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'

我对可选初始化过程的理解是否正确?如果是这样,为什么当我更改num2let.

我期待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或不自动设置。

4

2 回答 2

6

的行为var num2: Int?是由Optionals 以糖为动力引起的。它们是 Swift 中唯一具有隐式默认值 (of .None) 的类型。

请注意,如果您键入var num2: Int(without ?) – 编译器将抛出相同的错误,无论使用varvs. 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常数。


您可以在此处此处阅读有关初始化存储属性的更多信息。

于 2015-11-15T11:31:34.817 回答
0

我认为这里有很多讨论。该线程的声明-在上面的链接中更深入地查看

常量的值不需要在编译时就知道,但你必须给它赋值一次。

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

let num2: Int? = .None
let num2: Int? = nil
于 2015-11-15T11:25:50.360 回答