我们可以使用willset并使用getter和setter进行设置

时间:2017-08-20 09:49:07

标签: swift properties getter-setter

我正在阅读有关willset和swift属性的信息 我开始知道我可以使用带有初始值的变量,如下所示:

var property = "name"
{
    willSet
    {
        print("property is about to changed")
    }
    didSet
    {
        if property == oldValue
        {
            print("values are same")
        }
        else
        {
            print("value changed")
        }
    }
}

property = "anothername"

所以我可以使用willget和didset如下:

var property2:String{

    willSet
    {
        print("value is about to change")
    }
    didSet
    {
        print("value is changes")
    }
}

它给了我这个错误:

non-member observing properties require an initializer
var property2:String{
    ^

所以任何人都可以向我解释这里发生了什么,我可以使用getset和setter与willset一起做,并且像:

var property2:String{

    get{return property2}
    set{propert2 = newValue}

    willSet
    {
        print("value is about to change")
    }
    didSet
    {
        print("value is changes")
    }
}

3 个答案:

答案 0 :(得分:1)

错误说明你缺少初始化程序可以通过给属性一个默认值来解决,就像你的第一段代码一样:

var property2:String = "Some default value"{

    willSet
    {
        print("value is about to change")
    }
    didSet
    {
        print("value is changes")
    }
}

现在我将回答为什么你不能在计算属性上使用属性观察器。

因为没有意义。

对于可设置的计算属性,您已经拥有了setter,因此您可以在setter 中设置值时编写要执行的任何代码。为什么还需要额外的willSetdidSet?对于只有get的计算属性,它不能设置,所以你希望什么时候执行willSetdidSet

基本上,计算属性中的set块已经满足willSetdidSet的目的。您在willSet中编写的所有内容都可以在设置值之前在set中编写。您在didSet中撰写的所有内容,您可以在设置值后在set中书写。

另请注意,您的第三个代码可能会导致堆栈溢出,因为您在其自己的getter中访问property2并将其设置在自己的setter中。

答案 1 :(得分:0)

从Apple Doc类和结构必须在创建该类或结构的实例时将其所有存储的属性设置为适当的初始值。存储的属性不能保留在不确定的状态。

所以你可以通过添加来解决这个问题吗? var property2:String?{

var property2:String?{

    willSet
    {
        print("value is about to change")
    }
    didSet
    {
        print("value is changes")
    }
}

答案 2 :(得分:0)

  • 第一期(第二个片段):

    属性/成员没有初始值,这就是错误消息所说的内容,您需要编写初始化程序或分配初始值,就像在第一个代码段中一样。该错误与观察者无关。

  • 第二期(第三段):

    不允许使用计算属性中的属性观察者。没有观察者的例子无论如何都不起作用(假设propert2是拼写错误,你的意思是property2)。设置器将导致无限循环,因为它正在调用自身。