Swift中泛型数组的问题

时间:2015-06-29 13:32:03

标签: swift swift-playground swift2

由于我对iOS中的本机编程很新,我需要一些帮助以解决以下问题。我需要的是一个类,它包含一个数组或字典,其中包含2个整数作为键(用于网格矩阵中的坐标)和整数作为值。我在某个教程中找到了一个解决方案,如下所示:

class Array2D<T> {
    let columns: Int
    let rows: Int

    var array: Array<T?>

    init(columns: Int, rows: Int) {
        self.columns = columns
        self.rows = rows

        array = Array<T?>(count: rows * columns, repeatedValue: nil)
    }

    subscript(column: Int, row: Int) ->T! {
        get {
            return array[(row * columns) + column]
        }
        set(newValue) {
            array[(row * columns) + column] = newValue
        }
    }
}

不幸的是,这种类型的数组已经具有行*列的长度,只要初始化类,我不想要。该数组在开头应为空。但是如果我初始化一个空数组,那么在获取或设置尚未存在的键的值时会遇到问题。此外,我需要能够轻松增加特定键的值(如array[2, 3]++)。有没有人能解决我的问题?

2 个答案:

答案 0 :(得分:0)

只需将它与选项一起使用,这样就不会设置初始值。在此示例中,您的columns属于rows作为选项,并使用nil初始化。该数组初始化为空数组。

class Array2D<T> {
    let columns: Int? = nil
    let rows: Int? = nil

    var array: Array<T?> = []
}

答案 1 :(得分:0)

为什么不为

这样的坐标创建struct
struct Coordinate {
    let column: Int
    let row: Int
}

...然后为EquatableHashable协议提供必要的实现,然后将其用作字典中的键,如:

struct Array2D<T> {
    private var storage = [Coordinate: T]()
    // ...
}

...然后为该Array2D提供subscript,当分配一个值时,只需将新条目插入到水下字典中,当读取该值时,只需从那里读取它。