【问题标题】:Swift optional initialisationSwift 可选初始化
【发布时间】:2016-02-16 14:02:08
【问题描述】:

据我了解

var perhapsInt : Int?

这会自动设置为.None 值。下面的代码 sn-p 确认(没有编译器错误)

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

【问题讨论】:

    标签: swift initialization init optional optional-variables


    【解决方案1】:

    我认为很多讨论是here。 来自该线程的声明-在上面的链接中更深入地查看

    常量的值不需要在编译时知道,但是 您必须为其赋值一次。

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

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

    【讨论】:

    • 是的,这是有道理的,因为有两种方法可以快速初始化变量(或常量)。 1. 默认值(您在此处完成)或 2. 使用 init 方法进行初始化
    【解决方案2】:

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

    因为lets' 的值不能被覆盖(相对于vars'),它们要求您明确设置它们的初始值:

    class MyClass {
        let num2: Int? = nil
    }
    
    // or this way
    
    class MyClass {
        let num2: Int?
        init() {
            num2 = nil
        }
    }
    

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


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

    【讨论】:

    • 好吧,有道理。谢谢。作为一个后续问题,为什么当我在“init”中初始化一个“let”但在我定义它时没有初始化它时它会起作用?看到这个代码块。类 MyClass { 让 num2: Int? init() { self.num2 = nil } } 这不应该在“let num2: Int”周围引发错误吗?行
    • 没有。 let 只要求您赋值一次,不多也不少。在谈论初始化器时,它们要求所有lets 在初始化完成之前都有一个值。因此,您可以通过默认值、 在初始化程序本身中执行此操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 2015-08-19
    • 2020-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多