Swift 斯威夫特能把懒惰和懒惰结合在一起

Swift 斯威夫特能把懒惰和懒惰结合在一起,swift,Swift,我有一处房产 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 p

我有一处房产

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
    }()
我想添加一个
didSet
方法,可能吗?

是一个常量,不能对其进行任何设置。与
let
常量的唯一区别在于它(可能)稍后初始化

提供有关在
lazy
情况下为什么使用
var
而不是
let
的更多信息

编辑:使答案看起来不是空的 看看作者在哪里提出了一些有效的观点,关于为什么可能还不支持观察
lazy
vars。观察者中的
oldValue
应该是什么<代码>零?在非可选的情况下,这不是一个好主意。

简短回答:不

在您的某个类或方法中尝试以下简单示例:

lazy var myLazyVar: Int = {
    return 1
} () {
    willSet {
        print("About to set lazy var!")
    }
}
这会导致以下编译时错误:

惰性属性可能没有观察者


关于另一个答案中的
let
语句:惰性变量不是必需的,只是“具有延迟初始化的let常量”。考虑下面的例子:

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获得效果

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

什么是ar中的p的
ar
?改变了它,实际上与问题无关。谢谢。“let常量的唯一区别是它(可能)在以后初始化”,这并不是真的。惰性变量也可以用作
var
:s,请参见我添加的示例。关于编辑:我同意,添加得不错。另外,您之前也有过这样的观点,即惰性变量在初始化之后通常应该表现得非常不可变,因为通常情况下,我们在(大型?)类或结构实例上使用惰性变量,这些实例本身不会改变(即使其成员发生变化;但我们可以对此使用单独的观察者)。因此,我们在惰性变量的初始化器中只会设置一次自己的
(例如,print“Will be set!”)。所以,也许苹果打算(按照惯例)让懒惰的变量在init之后不会改变,这也是为什么没有prop的另一个原因。观察家们,你们说得绝对正确,我的答案基本上是“不”,你们会把它从我的答案中去掉的!