由于我对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]++
)。有没有人能解决我的问题?
答案 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
}
...然后为Equatable
和Hashable
协议提供必要的实现,然后将其用作字典中的键,如:
struct Array2D<T> {
private var storage = [Coordinate: T]()
// ...
}
...然后为该Array2D提供subscript
,当分配一个值时,只需将新条目插入到水下字典中,当读取该值时,只需从那里读取它。