Swift 初始化类的实例时,顺序是什么?
我对这里发生的序列感到困惑(我完全知道Swift 初始化类的实例时,顺序是什么?,swift,initialization,constants,Swift,Initialization,Constants,我对这里发生的序列感到困惑(我完全知道var和let之间的区别)。但是为什么我会犯这样的错误呢 如果我正在使用init方法,那么这不意味着我没有使用 默认参数 为什么我不能用另一个常量更改默认常量 您不能多次分配let变量-但是,您可以定义它并使其保持未初始化状态。然后在init方法中,您可以将代理参数的默认值设置为“nobody” class Actor { let agent: String? = "nobody" init(agent: String){
var
和let
之间的区别)。但是为什么我会犯这样的错误呢
- 如果我正在使用
方法,那么这不意味着我没有使用 默认参数init
- 为什么我不能用另一个常量更改默认常量
init
方法中,您可以将代理
参数的默认值设置为“nobody”
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")
正如Alexander在下面的评论中所建议的,如果init方法中的参数太多,默认值可能会变得有点混乱。考虑创建一个独立的init方法来设置默认值。< /P>
class Actor {
let agent: String
init(agent: String = "nobody"){
self.agent = agent
}
}
print(Actor().agent) // "nobody"
print(Actor(agent: "xyz").agent) // "xyz"
不能多次分配let变量-但是,可以定义它并使其保持未初始化状态。然后在
init
方法中,您可以将代理
参数的默认值设置为“nobody”
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")
正如Alexander在下面的评论中所建议的,如果init方法中的参数太多,默认值可能会变得有点混乱。考虑创建一个独立的init方法来设置默认值。< /P>
class Actor {
let agent: String
init(agent: String = "nobody"){
self.agent = agent
}
}
print(Actor().agent) // "nobody"
print(Actor(agent: "xyz").agent) // "xyz"
是的,如果您只有几个值可以设置默认值,那么这绝对是一种方法。如果有2-3个以上的值,最好定义一个单独的初始值设定项,它不带参数,设置所有的默认值。@Alexander我不明白的矛盾是,你要么读取属性,要么不读取属性。如果你读了,那么我的答案是肯定的,我的代码应该会失败,同样应该是
让代理:String?
还是它读了这一行,但现在什么也没发生?!因为它默认为零,并且像前面提到的那样被困在那里,这是愚蠢的。基本上这是一个例外,如果你不读的话,我不应该得到错误。@亲爱的,我不明白你在说什么saying@Honey是的,这就是为什么init计算为重新分配,这违反了“let”为什么使代理成为可选的?如果在所有初始值设定项中都正确设置了它,就不要让它成为可选的。是的,如果只有几个值可以设置默认值,那么这绝对是一种方法。如果有2-3个以上的值,最好定义一个单独的初始值设定项,它不带参数,设置所有的默认值。@Alexander我不明白的矛盾是,你要么读取属性,要么不读取属性。如果你读了,那么我的答案是肯定的,我的代码应该会失败,同样应该是让代理:String?
还是它读了这一行,但现在什么也没发生?!因为它默认为零,并且像前面提到的那样被困在那里,这是愚蠢的。基本上这是一个例外,如果你不读的话,我不应该得到错误。@亲爱的,我不明白你在说什么saying@Honey是的,这就是为什么init计算为重新分配,这违反了“let”为什么使代理成为可选的?如果它在所有初始值设定项中都正确设置,则不要将其设置为可选。