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?
7
A
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. willSet
và didSet
không được gọi chỉ khi giá trị được đặt trong bộ khởi tạo.
Các vấn đề liên quan
- 1. Đặt cùng một giá trị cho nhiều thuộc tính (CSS)
- 2. Getters and Setters in Swift - Thay vào đó bạn có sử dụng WillSet và DidSet không?
- 3. Có tương tự didSet/willSet trong Kotlin không?
- 4. Java có quan sát thuộc tính tương tự như các phương thức willSet & didSet của Swift không?
- 5. Tôi có thể đặt nhiều giá trị của cùng một thuộc tính CSS với Javascript không?
- 6. Đặt giá trị mặc định cho thuộc tính khóa ngoài
- 7. Đặt thuộc tính giá trị của RadioButton
- 8. Đặt giá trị mặc định cho thuộc tính
- 9. Tránh kiểm tra nhiều lần cho các giá trị rỗng trên cùng một thuộc tính
- 10. XStream phân tích các thuộc tính và các giá trị cùng một lúc
- 11. Nhiều giá trị cho thuộc tính rel
- 12. Tạo DynamicMethod để gán giá trị cho một thuộc tính?
- 13. console.log() hiển thị các giá trị mâu thuẫn cho cùng một thuộc tính đối tượng
- 14. Cách đặt giá trị thuộc tính bằng Biểu thức?
- 15. Mục tiêu-C đặt giá trị mặc định cho một thuộc tính
- 16. Tôi có thể chọn nhiều hơn một giá trị cho một thuộc tính trong XAML không?
- 17. "Sử dụng mơ hồ thuộc tính 'propertyName'" lỗi cho thuộc tính ghi đè với người quan sát didSet
- 18. 2 tên cho cùng một thuộc tính
- 19. Lược đồ XML: Tôi có thể yêu cầu một số giá trị của thuộc tính nhưng vẫn cho phép các giá trị khác không?
- 20. Thay đổi giá trị đang được đặt trong khối willSet của biến
- 21. Cách đặt giá trị thuộc tính hệ thống trong NetBeans?
- 22. CSS3: đặt hình nền để rel giá trị thuộc tính
- 23. Cách sử dụng MethodInfo.Invoke để đặt giá trị thuộc tính?
- 24. Cùng một giá trị cho id (float)
- 25. Tôi có thể đặt một trích dẫn trong thuộc tính JQuery bằng bộ chọn ([thuộc tính = giá trị]) không?
- 26. Cách đặt thuộc tính giá trị HTML (có dấu cách)
- 27. ValidateInput (false) và AllowHtml thuộc tính vẫn gây 'Một giá trị Request.Form nguy hiểm đã được phát hiện'
- 28. Đặt thuộc tính CSS trên cùng và bên trái
- 29. Thay đổi giá trị cho mục thuộc tính trong PropertyGrid
- 30. Tại sao không .getPropertyValue() trả về một giá trị cho thuộc tính "borderRadius"?
Điều gì sẽ xảy ra nếu bạn thử? –
@MikePollard Tôi đã đăng câu trả lời của mình khi tôi đặt câu hỏi. –