Swift中的泛型数组问题
由于我对iOS中的本机编程非常陌生,因此在以下情况下需要一些帮助。我需要的是一个类,它包含一个数组或字典,其中2个整数作为键(用于网格矩阵中的坐标),1个整数作为值。我在某个地方的教程中找到了一个解决方案,如下所示:Swift中的泛型数组问题,swift,swift-playground,swift2,Swift,Swift Playground,Swift2,由于我对iOS中的本机编程非常陌生,因此在以下情况下需要一些帮助。我需要的是一个类,它包含一个数组或字典,其中2个整数作为键(用于网格矩阵中的坐标),1个整数作为值。我在某个地方的教程中找到了一个解决方案,如下所示: class Array2D<T> { let columns: Int let rows: Int var array: Array<T?> init(columns: Int, rows: Int) {
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
}
}
}
类数组2d{
let列:Int
让行:Int
变量数组:数组
init(列:Int,行:Int){
self.columns=列
self.rows=行
数组=数组(计数:行*列,重复值:零)
}
下标(列:Int,行:Int)->T{
得到{
返回数组[(行*列)+列]
}
设置(新值){
数组[(行*列)+列]=newValue
}
}
}
不幸的是,一旦类初始化,这种类型的数组就已经具有行*列的长度,这是我不想要的。数组开始时应为空。但是如果我初始化一个空数组,在获取或设置一个还不存在的键的值时就会遇到问题。此外,我需要能够轻松地增加特定键的值(如
array[2,3]++
)。有人能很好地解决我的问题吗?只需将它与选项一起使用,这样就不会设置初始值。在本例中,您有您的列
和行
,它们是可选的,并用nil
初始化。数组初始化为空数组
class Array2D<T> {
let columns: Int? = nil
let rows: Int? = nil
var array: Array<T?> = []
}
类数组2d{
let列:Int?=nil
让行:Int?=nil
变量数组:数组=[]
}
为什么不为类似的坐标创建struct
struct Coordinate {
let column: Int
let row: Int
}
。。。然后为equalable
和Hashable
协议提供必要的实现,然后将其用作字典中的键,如:
struct Array2D<T> {
private var storage = [Coordinate: T]()
// ...
}
struct Array2D{
专用变量存储=[Coordinate:T]()
// ...
}
。。。然后为该数组2d提供
下标
,当赋值时,该下标只需在水下字典中插入新条目,当读取该值时,只需从那里读取即可。您能更好地阐明您想要实现的目标吗?您有固定数量的行/列吗?你说的“一开始就空”是什么意思?如果以前从未设置过该值,array[2,3]
应该返回什么?谢谢@ABakerSmith,这正是我想要的!抱歉@Martin R没有说清楚…:(谢谢,但这并不能解决下标getter和setter的问题,它在尝试获取或设置不存在的键的值时会抛出错误(即testArray[3,4]=6//error
)