ios - 尝试快速遍历结构数组时出现奇怪的语法

标签 ios swift struct

我有一个简单的结构数组

var fields: [ProfileField]?

当我尝试遍历这个数组时,swift 向我显示这段代码的错误:

guard let _fields = fields else {return}
for field in _fields {
}

错误是:

Cannot use mutating getter on immutable value: 'field' is a 'let' constant

这段代码编译得很好:

for var field in _fields {
}

为什么我需要将 field 声明为 var

最佳答案

Swift 中的“mutating getter”是一种属性,其 get block 具有 mutating 修饰符。例如,如果您的 ProfileField 如下所示:

struct ProfileField {
    var accessCount: Int = 0

    var x: Int {
        mutating get {    // ← mutating getter here
            accessCount++
            return x
        }
    }
}

...然后这段代码会产生“不能在不可变值上使用可变 getter”错误:

for field in _fields {
    print(field.x)
}

即使它看起来不像field.x修改field,它确实:它递增accessCount。这就是为什么你必须使用 var field 来使字段可变。 (默认情况下,for 循环迭代器是 let。)

没有看到您的 ProfileField 或您的 for 循环的主体,就不可能确切地说出为什么会出现这种情况。如果您没有在 ProfileField 本身中使用 mutating get,它可能发生在嵌套在 ProfileField 中的结构中。

关于ios - 尝试快速遍历结构数组时出现奇怪的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33438194/

相关文章:

go - 在用作指针的结构中嵌入结构与指向结构的指针

c - 尝试 printf 时出现段错误

android - 谷歌地图 api key - 跨平台

ios - Xcode 7 : WatchOS storyboards do not support target device type 'iphone'

swift - 在没有向下转换错误的情况下处理 Swift 4.2 中的错误

ios - NSLayoutConstraint 常量的值始终返回 0 swift 3

c++ - 为什么指针不递增

ios - 单击时删除 UITableViewCells 按钮

ios - UIScrollView 上的 UICollectionView 卡住

Swift SpriteKit 间质广告停止音效