Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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 在init方法中更改属性将不会调用属性';他死了。为什么?_Swift - Fatal编程技术网

Swift 在init方法中更改属性将不会调用属性';他死了。为什么?

Swift 在init方法中更改属性将不会调用属性';他死了。为什么?,swift,Swift,我认为属性“gf”在调用“super.init”之前已经初始化,其值为nil。因此,在“super.init”下面,重置“gf”应该称其为“didSet”。但事实并非如此。我想知道原因。这可以解决您的问题,也可以解释为什么它不起作用。首先看一下回答者的评论,其行为如中所述,“当您为存储的属性指定默认值,或在初始值设定项中设置其初始值时,将直接设置该属性的值,而无需调用任何属性观察者。”。其次,就原因而言,我怀疑这是因为观察者可以引用self,而在初始化完成之前,您不希望这样做。我认为,只是全面禁

我认为属性“gf”在调用“super.init”之前已经初始化,其值为nil。因此,在“super.init”下面,重置“gf”应该称其为“didSet”。但事实并非如此。我想知道原因。

这可以解决您的问题,也可以解释为什么它不起作用。首先看一下回答者的评论,其行为如中所述,“当您为存储的属性指定默认值,或在初始值设定项中设置其初始值时,将直接设置该属性的值,而无需调用任何属性观察者。”。其次,就原因而言,我怀疑这是因为观察者可以引用
self
,而在初始化完成之前,您不希望这样做。我认为,只是全面禁止直接在初始化器的上下文中调用属性观察者,无论是在
super.init
之前还是之后。通过这种方式,规则更加一致,尽管我同意在
super.init
之后调用属性观察器不会有任何错误(链接的Q&A中所示的简单解决方法是to或,两者都避开了初始化器上下文)。值得注意的是,此行为实际上与属性观察者的文档冲突–比较@Rob,但因为OP在
super.init
之后设置它。在这种情况下,
self
已完全初始化,因此属性已初始化为默认值
nil
。因此,在这种情况下,给观察者打电话应该没有什么问题。这应该可以解决你的问题,也可以解释为什么它不起作用。首先看一下回答者的评论,其行为如中所述,“当您为存储的属性指定默认值,或在初始值设定项中设置其初始值时,将直接设置该属性的值,而无需调用任何属性观察者。”。其次,就原因而言,我怀疑这是因为观察者可以引用
self
,而在初始化完成之前,您不希望这样做。我认为,只是全面禁止直接在初始化器的上下文中调用属性观察者,无论是在
super.init
之前还是之后。通过这种方式,规则更加一致,尽管我同意在
super.init
之后调用属性观察器不会有任何错误(链接的Q&A中所示的简单解决方法是to或,两者都避开了初始化器上下文)。值得注意的是,此行为实际上与属性观察者的文档冲突–比较@Rob,但因为OP在
super.init
之后设置它。在这种情况下,
self
已完全初始化,因此属性已初始化为默认值
nil
。因此,在这种情况下,调用观察者不应该有任何问题。
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Boy: Person {
    var gf: String! {
        didSet {
            print("have a girlfriend: \(gf)")
        }
    }
    override init(name: String) {
        super.init(name: name)
        gf = "Lilian"
    }
}