提问人:Peter71 提问时间:4/12/2023 更新时间:4/12/2023 访问量:117
避免在懒惰的 getter 函数上“$0 是不可变的”?
Avoid "$0' is immutable" on a lazy getter function?
问:
我的结构中有一个名为 labelColors 的懒惰变量:
lazy var _labelColors: LabelType = { return url.getTagColors() }()
var labelColors : LabelType {
mutating get { return _labelColors }
set { _labelColors = newValue }
}
它应该只在第一次真正需要它的时候调用它的价值。 在我的巨大数组上使用过滤器时,我有
let redFilesOnly = files.filter({ $0.labelColors.isColorSet(color: TagColors.red) })
但错误是“不能对不可变值使用变异 getter:'$0' 是不可变的”。但是,我如何使用被定义为懒惰的 getter 函数,因此它将改变其值呢?
答:
1赞
Omer Tekbiyik
4/12/2023
#1
问题不在于结构或懒惰的定义。在那一行中,迭代与结构,你有一个变量(这里是一个let)和let常量不能被修改,因为你知道,所以你收到这个错误消息。要解决该问题,请使用: files.filter({ $0.labelColors.isColorSet(color: TagColors.red) })
let
$0
let redFilesOnly = files.filter({ val in
var new = val
return new.labelColors.isColorSet(color: TagColors.red)
})
评论
0赞
Joakim Danielson
4/12/2023
这怎么不是重复的?
0赞
Omer Tekbiyik
4/12/2023
该页面打开了很长时间。我没有看到你的答案:)我只是写了一个额外的解释,所以我把答案保留@JoakimDanielson
1赞
Joakim Danielson
4/12/2023
它仍然是重复的。
0赞
Peter71
4/12/2023
只是为了理解:将值复制到“new”,然后通过lazy函数更新new的属性。所以原来的($0)还是没动过?
0赞
Omer Tekbiyik
4/12/2023
$0 未被触及,是的,但是当您返回带有“new”的操作时,属性 redFilesOnly 受到影响
评论