Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift中的泛型数组问题_Swift_Swift Playground_Swift2 - Fatal编程技术网

Swift中的泛型数组问题

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) {

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

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