【问题标题】:When an instance of a class is initialized, what is the sequence?当一个类的实例被初始化时,顺序是什么?
【发布时间】:2017-06-27 23:27:40
【问题描述】:
class Actor {
    let agent: String? = "nobody"

    init(agent: String){
        self.agent = agent // error: immutable value 'self.agent' may only be initialized once
    }
}

let John = Actor(agent: "xyz")

我对这里发生的序列感到困惑(我完全了解varlet 之间的区别)。但是为什么我会收到这个错误?

  • 如果我使用init 方法,那不意味着我没有使用 默认参数?
  • 为什么我不能用另一个更改默认常量?

【问题讨论】:

    标签: swift initialization constants


    【解决方案1】:

    您不能多次分配 let 变量 - 但是,您可以定义它并使其保持未初始化状态。然后在您的init 方法中,您可以将"nobody" 作为agent 参数的默认值。

    class Actor {
        let agent: String
    
        init(agent: String = "nobody"){
            self.agent = agent
        }
    }
    
    print(Actor().agent) // "nobody"
    print(Actor(agent: "xyz").agent) // "xyz"
    

    正如 Alexander 在下面的 cmets 中所建议的,如果您的 init 方法中有太多参数,默认值可能会变得有些混乱。考虑创建一个单独的 init 方法来设置默认值。

    class Actor {
        let agent: String
        ...
    
        init() {
            self.agent = "nobody"
            ...
        }
    
        init(agent: String, ...){
            self.agent = agent
            ...
        }
    }
    

    【讨论】:

    • 是的,如果您只有几个值可以设置默认值,这绝对是可行的方法。如果你有超过 2-3 个,最好定义一个单独的初始化器,它不带参数,它设置所有默认值。
    • @Alexander 我不明白的悖论是,您要么阅读属性,要么不阅读。如果您阅读了,那么是的,我的回答是,我的代码应该失败,let agent : String? 也应该失败,或者它是否读取了这一行,但此时没有任何反应?!因为它默认为 nil 并被卡在here 中,这很愚蠢。基本上这是一个例外,如果你不阅读它,我不应该得到错误。
    • @Honey 我不明白你在说什么
    • @Honey 是的,这就是为什么 init 算作重新分配,这违反了“让”
    • 为什么将agent 设为可选?如果在所有初始化程序中都正确设置了它,不要让它成为可选的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    相关资源
    最近更新 更多