2014-08-28 16 views
7

Nếu tôi đặt giá trị thuộc tính cho cùng một giá trị như hiện tại được đặt thành, sẽ willSet và didSet được gọi? Điều này rất quan trọng để biết khi nào bạn có phản ứng phụ xảy ra trong các chức năng này.Không đặt cùng một giá trị cho thuộc tính vẫn gọi willSet và didSet?

+1

Điều gì sẽ xảy ra nếu bạn thử? –

+3

@MikePollard Tôi đã đăng câu trả lời của mình khi tôi đặt câu hỏi. –

Trả lời

12

Có, willSet và didSet được gọi ngay cả khi cài đặt ở cùng một giá trị. Tôi đã thử nghiệm nó trong một sân chơi:

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"} 

Nếu bạn muốn ngăn chặn tác dụng phụ xảy ra khi cùng giá trị đã được thiết lập, bạn có thể so sánh giá trị để 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

Vâng, nó có. Bạn có thể có một thuộc tính kiểu không phù hợp với giao thức Equatable và sau đó "cùng một giá trị" sẽ không có ý nghĩa. willSetdidSet không được gọi chỉ khi giá trị được đặt trong bộ khởi tạo.

Các vấn đề liên quan