Matrix Swift:如何在Swift中声明二维数组(网格或矩阵)以允许随机插入
我需要能够在2d矩阵或网格中存储有关单元的信息。数据是不连续的,所以当较低的行和列中没有数据时,我可能需要将数据存储在5,5 我的第一个想法是动态调整数组大小。但是Swift数组的边界不会自动增长。如果我试图将某个东西放在索引5中,而它超出了它当前的大小,那么它将失败,并出现越界异常 Swift或Cocoa中是否有支持随机访问网格的集合类。NSArray也不支持它 另一个想法是将元素存储在字典中,并使用行、列的元组作为键。但是,元组是不可散列的,不能用作字典的键 我当前的方法是使用一个填充了空值的集合大小预初始化数组。Matrix Swift:如何在Swift中声明二维数组(网格或矩阵)以允许随机插入,matrix,collections,swift,grid,Matrix,Collections,Swift,Grid,我需要能够在2d矩阵或网格中存储有关单元的信息。数据是不连续的,所以当较低的行和列中没有数据时,我可能需要将数据存储在5,5 我的第一个想法是动态调整数组大小。但是Swift数组的边界不会自动增长。如果我试图将某个东西放在索引5中,而它超出了它当前的大小,那么它将失败,并出现越界异常 Swift或Cocoa中是否有支持随机访问网格的集合类。NSArray也不支持它 另一个想法是将元素存储在字典中,并使用行、列的元组作为键。但是,元组是不可散列的,不能用作字典的键 我当前的方法是使用一个填充了空值
有更好的方法吗?这里是一个非常基本的实现,使用
字典
作为后端存储:
struct Matrix2D<KeyElem:Hashable, Value> {
var _storage:[KeyElem:[KeyElem:Value]] = [:]
subscript(x:KeyElem, y:KeyElem) -> Value? {
get {
return _storage[x]?[y]
}
set(val) {
if _storage[x] == nil {
_storage[x] = [:]
}
_storage[x]![y] = val
}
}
}
var matrix = Matrix2D<Int, String>()
matrix[1,2] = "foo"
阵列
后端版本
struct Matrix2D<T> {
var _storage:[[T?]] = []
subscript(x:Int, y:Int) -> T? {
get {
if _storage.count <= x {
return nil
}
if _storage[x].count <= y {
return nil
}
return _storage[x][y]
}
set(val) {
if _storage.count <= x {
let cols = [[T?]](count: x - _storage.count + 1, repeatedValue: [])
_storage.extend(cols)
}
if _storage[x].count <= y {
let rows = [T?](count: y - _storage[x].count + 1, repeatedValue: nil)
_storage[x].extend(rows)
}
_storage[x][y] = val
}
}
}
struct Matrix2D{
变量存储:[[T?]=[]
下标(x:Int,y:Int)->T{
得到{
如果_storage.count太好了!谢谢。我可以使用数组后端,但不能使用字典后端。
struct Matrix2D<T> {
var _storage:[[T?]] = []
subscript(x:Int, y:Int) -> T? {
get {
if _storage.count <= x {
return nil
}
if _storage[x].count <= y {
return nil
}
return _storage[x][y]
}
set(val) {
if _storage.count <= x {
let cols = [[T?]](count: x - _storage.count + 1, repeatedValue: [])
_storage.extend(cols)
}
if _storage[x].count <= y {
let rows = [T?](count: y - _storage[x].count + 1, repeatedValue: nil)
_storage[x].extend(rows)
}
_storage[x][y] = val
}
}
}