swift - 初始化类的实例时,顺序是什么?

标签 swift initialization constants

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 方法,那是否意味着我没有使用 默认参数?
  • 为什么我不能用另一个更改默认常量?

最佳答案

您不能多次分配一个 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 在下面的评论中所建议的,如果您的 init 方法中有太多参数,默认值可能会变得有点困惑。考虑创建一个单独的 init 方法来设置默认值。

class Actor {
    let agent: String
    ...

    init() {
        self.agent = "nobody"
        ...
    }

    init(agent: String, ...){
        self.agent = agent
        ...
    }
}

关于swift - 初始化类的实例时,顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42145422/

相关文章:

optimization - 在 Go (golang) 中嵌入结构化数据

inheritance - 理解swift语言中的去初始化和继承

c++ - 当一个结构有 c-tor 时,为什么我不能静态初始化它?

c++ - 为什么在派生类数据之前初始化基类数据

c - const 限定符和 Const 指针

c++ - 具有 const 参数和重载的函数

swift - SpriteKit 动画

ios - 如何通过点击取消按钮显示两个 ViewController 之一?

swift - Swift 的 LLDB : Custom type summary for generic type

c - C 语言是否只为 void 指针指定任何隐式初始化?