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的另一个原因。观察家们,你们说得绝对正确,我的答案基本上是“不”,你们会把它从我的答案中去掉的!