微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift可选的初始化

这是我的理解

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或不是.

解决方法

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

请注意,如果键入var num2:Int(不带?) – 编译器将抛出相同的错误,无论使用var与let.

class MyClass {
    var num2: Int
    init() {
        // Return from initializer without initializing all stored properties
    }
}

因为let’值不能被覆盖(与vars相反),它们要求您显式设置其初始值:

class MyClass {
    let num2: Int? = nil
}

// or this way

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

然而,这将导致无用的零常数.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐