Swift可选的初始化

时间:2015-11-15 11:10:02

标签: swift initialization init optional optional-variables

我理解

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,也可能不会。

2 个答案:

答案 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常数。

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

答案 1 :(得分:0)

我认为很多讨论都是here。 来自该主题的声明 - 深入了解上述链接

  

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

如果您将let值设置为:

,则可以编译代码
let num2: Int? = .None
let num2: Int? = nil