是否可以允许在Swift初始化期间调用didSet?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

Apple的文档指出:

当一个属性首次初始化时,willSet和didSet观察者不会被调用。只有在属性值设置在初始化上下文之外时才会调用它们。

是否有可能在初始化时强制这些被调用?

为什么?

假设我有这门课

class SomeClass {
    var someProperty: AnyObject {
        didSet {
            doStuff()
        }
    }

    init(someProperty: AnyObject) {
        self.someProperty = someProperty
        doStuff()
    }

    func doStuff() {
        // do stuff now that someProperty is set
    }
}

我创建了该方法doStuff,以使处理调用更加简洁,但我宁愿只处理didSet函数内的属性。有没有办法强制这个在初始化过程中调用?

我决定删除我的类的方便初始化程序,并强制您在初始化后设置属性。这让我知道didSet将永远被称为。我还没有决定这是否更好,但它适合我的情况。

提问于
用户回答回答于

创建一个自己的set-Method并在init-Method中使用它:

class SomeClass {
    var someProperty: AnyObject! {
        didSet {
            //do some Stuff
        }
    }

    init(someProperty: AnyObject) {
        setSomeProperty(someProperty)
    }

    func setSomeProperty(newValue:AnyObject) {
        self.someProperty = newValue
    }
}
用户回答回答于

如果在初始化程序中使用延迟,为了更新任何可选属性或进一步更新已经初始化的非可选属性,并且在调用任何超级初始化方法之后,将调用willSet,didSet等。我发现这比实施单独的方法更方便,您必须跟踪在正确的位置调用。

例如:

public class MyNewType : NSObject {
    public var myRequiredField:Int
    public var myOptionalField:Float? {
        willSet {
            if let newValue = newValue {
                print("I'm going to change to \(newValue)")
            }
        }
        didSet {
            if let myOptionalField = self.myOptionalField {
                print("Now I'm \(myOptionalField)")
            }
        }
    }

    override public init() {
        self.myRequiredField = 1

        super.init()

        // Non-defered
        self.myOptionalField = 6.28

        // Defered
        defer {
            self.myOptionalField = 3.14
        }
    }
}

会产生:

I'm going to change to 3.14
Now I'm 3.14

扫码关注云+社区