在Swift中为通用选项分配nil

时间:2014-08-18 08:35:09

标签: ios generics swift

我在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?'

1 个答案:

答案 0 :(得分:3)

错误消息具有误导性。 test()方法修改属性的值 在结构中,你必须将其标记为“变异”:

struct Grid<T> {
    // ...

    mutating func test() {
        grid[0] = nil
    }
}

请参阅Swift书中的Modifying Value Types from Within Instance Methods

  

从实例方法中修改值类型

     

结构和枚举是值类型。默认情况下   无法在其实例中修改值类型的属性   方法

     

但是,如果您需要修改结构的属性或   在特定方法中的枚举,您可以选择变异   该方法的行为。 ...