斯威夫特可以懒和didSet一起设置

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

我想添加一个didSet方法,有可能吗?


简短答案:否。

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

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.

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

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

points是一个常量,您不能为其设置任何内容。与let常量的唯一区别是它稍后可能会被初始化。

此答案提供了有关为何在lazy情况下使用var而不是let的更多信息。

编辑:使答案不为空
看一下这篇博客文章,作者提出了一些有效的观点,说明为什么尚不支持观察lazy vars。 oldValue在观察者中应该是什么? nil?在您的非可选情况下,这不是一个好主意。