Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 初始化类的实例时,顺序是什么?_Swift_Initialization_Constants - Fatal编程技术网

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

您不能多次分配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"

不能多次分配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”为什么使
代理成为可选的?如果它在所有初始值设定项中都正确设置,则不要将其设置为可选。