[英]In SwiftUI, how do I know when a Picker selection was changed? Why doesn't didSet work?
[英]Why doesn't didSet work?
在我在 SO 上看到的許多didSet
示例中,此代碼將返回0
,但是,我無法讓它返回原始值以外的任何內容。 我究竟做錯了什么?
迅速
struct Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
}
var circ = Circle(radius: -25)
print(circ.radius)
輸出
-25
didSet
在初始化期間不會被調用,只會在之后調用。 如果您想在初始化期間驗證數據,您的初始化程序應該這樣做。
如果添加:
circ.radius = -50
print(circ.radius)
您會看到它按預期工作,輸出將為0.0
。
如果將它放在defer
語句中,則可以確保init
didSet
。 也適用於deinit
。
class Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
init(radius: Double) {
defer { self.radius = radius }
}
}
正如 Paul 在評論中所寫的,屬性觀察者didSet
和willSet
在值初始化期間不會被調用。
如果你想在初始化時調用它們的值,你可以添加一個函數調用來在初始化器中初始設置radius
屬性后重新設置它:
struct Circle {
var radius: Double {
didSet {
if radius < 0 {
radius = 0
}
}
}
init(radius: Double) {
self.radius = radius
setRadius(radius) // <-- this will invoke didSet
}
mutating func setRadius(radius: Double) {
self.radius = radius
}
}
var circ = Circle(radius: -25)
print(circ.radius) // 0.0
為此使用 init:
struct Circle {
var radius: Double
init(radius: Double) {
self.radius = radius < 0 ? 0 : radius
}
}
var circ = Circle(radius: -25)
print(circ.radius)
0.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.