Swift can lazy and didSet set together
我有一个物业
1 2 3 4 5 6 7 8 | public lazy var points: [(CGFloat,CGFloat,CGFloat)] = { var pointsT = [(CGFloat,CGFloat,CGFloat)]() let height = 100.0 for _ in 1...10 { pointsT.append((someValue,someValue,100.0)) } return pointsT }() |
我想添加一个
简短答案:否。
在您的某些类或方法中尝试以下简单示例:
1 2 3 4 5 6 7 | lazy var myLazyVar: Int = { return 1 } () { willSet { print("About to set lazy var!") } } |
这会给您以下编译时错误:
Lazy properties may not have observers.
关于另一个答案中的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | struct MyStruct { var myInt = 1 mutating func increaseMyInt() { myInt += 1 } lazy var myLazyVar: Int = { return self.myInt } () } var a = MyStruct() print(a.myLazyVar) // 1 a.increaseMyInt() print(a.myLazyVar) // 1:"initialiser" only called once, OK a.myLazyVar += 1 print(a.myLazyVar) // 2: however we can still mutate the value // directly if we so wishes |
简短的答案就像其他人所说的"否"一样,但是有一种方法可以使用私有的惰性var和计算的var来获得效果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | private lazy var _username: String? = { return loadUsername() }() var username: String? { set { // Do willSet stuff in here if newValue != _username { saveUsername(newValue) } // Don't forget to set the internal variable _username = newValue // Do didSet stuff here // ... } get { return _username } } |
否
s>
此答案提供了有关为何在
编辑:使答案不为空
看一下这篇博客文章,作者提出了一些有效的观点,说明为什么尚不支持观察