避免在懒惰的 getter 函数上“$0 是不可变的”?

Avoid "$0' is immutable" on a lazy getter function?

提问人:Peter71 提问时间:4/12/2023 更新时间:4/12/2023 访问量:117

问:

我的结构中有一个名为 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 函数,因此它将改变其值呢?

迅速 滤波器 lazy-evaluation 可变

评论


答:

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 受到影响