我在Swift中创建了一个简单的通用网格数据结构,如下所示。基本上它会创建一个类型为T的可选项数组?并使用nil初始化数组。但是当我尝试将一个网格元素显式设置为nil时,编译器会抱怨我不太懂的东西。
struct Grid<T> {
let columns: Int, rows: Int
var grid: [T?]
init(columns: Int, rows: Int) {
self.rows = rows
self.columns = columns
grid = Array(count: rows * columns, repeatedValue: nil)
}
func test() {
grid[0] = nil
}
}
编译器在添加test()函数时的强烈抗议:
Grid.swift:26:13: '@lvalue $T7' is not identical to 'T?'
答案 0 :(得分:3)
错误消息具有误导性。 test()
方法修改属性的值
在结构中,你必须将其标记为“变异”:
struct Grid<T> {
// ...
mutating func test() {
grid[0] = nil
}
}
请参阅Swift书中的Modifying Value Types from Within Instance Methods:
从实例方法中修改值类型
结构和枚举是值类型。默认情况下 无法在其实例中修改值类型的属性 方法
但是,如果您需要修改结构的属性或 在特定方法中的枚举,您可以选择变异 该方法的行为。 ...