簡體   English   中英

為什么 didSet 不起作用?

[英]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 在評論中所寫的,屬性觀察者didSetwillSet在值初始化期間不會被調用。

如果你想在初始化時調用它們的值,你可以添加一個函數調用來在初始化器中初始設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM