2014-08-28 46 views

回答

12

是的,即使设置为相同的值,willSet和didSet也会被调用。我在操场上进行了测试:

class Class1 { 
    var willSetCount = 0 
    var didSetCount = 0 
    var var1: String = "A" { 
     willSet { 
      willSetCount++ 
     } 
     didSet { 
      didSetCount++ 
     } 
    } 
} 

let aClass1 = Class1() // {0 0 "A"} 
aClass1.var1 = "A"  // {1 1 "A"} 
aClass1.var1 = "A"  // {2 2 "A"} 

如果你想阻止时被设置相同的值发生副作用,你可以将该值比较NEWVALUE /属性oldValue:

class Class2 { 
    var willSetCount = 0 
    var didSetCount = 0 
    var var1: String = "A" { 
     willSet { 
      if newValue != var1 { 
       willSetCount++ 
      } 
     } 
     didSet { 
      if oldValue != var1 { 
       didSetCount++ 
      } 
     } 
    } 
} 

let aClass2 = Class2() // {0 0 "A"} 
aClass2.var1 = "A"  // {0 0 "A"} 
aClass2.var1 = "B"  // {1 1 "B"} 
7

是,它确实如此。你可能有一个不符合Equatable协议的类型的属性,那么“相同的值”就没有意义。 willSetdidSet仅在初始化程序内设置值时才被调用。

相关问题