二维数组的数据结构

Data structure for bidimensional array

我有一个字符串数组。 它必须声明为空,然后一次填充一个数组。

我尝试了所有可能的数据结构,但其中 none 似乎有效。

例如,如果我声明

var array = [[String]]()

当我尝试附加元素时应用程序崩溃,例如

array[1][0] = "Some string"

我设法让它工作的唯一方法是用固定数量的元素声明数组,但这对我的目的不利。

我以为这很容易完成,但是我遇到了很多问题,有什么解决办法吗?

您不能像这样 array[1][0] = "Some string" 附加到空数组。如果你想这样做,你需要create an array with certain size and repeated value。但是你想创建二维数组,所以可以这样实现:

extension Array {
    static func bidimensional<T>(row: Int, _ column: Int, repeatedValue: T) -> [[T]] {
        var resultArray = [[T]]()
        for _ in 0...column {
            resultArray.append([T](count: row, repeatedValue: repeatedValue))
        }
        return resultArray
    }
}

var arr = [String].bidimensional(2, 2, repeatedValue: "")

arr[1][0] = "Hello there!"

print(arr[1][0]) // "Hello there!"

更新
Extension add new functionality to an existing class, structure, or enumeration type. In our case we extend Array type with function bidimensional. The static means, that it's type method, not instance method. The T means, that it's generic 方法。在这种情况下,您不仅可以使用一种特定类型(例如 String)调用 bidimensional 函数,还可以使用您想要的任何类型(StringIntDouble,等等)。好吧,bidimensional 的函数代码非常简单。我们只是用我们的自定义 (T) 类型创建空的 2D resultArray。然后我们用 repeatedValue 和 return 填充这个数组。就这些了。
P.S。为了清楚地了解泛型,有几个例子:

[Int].bidimensional(2, 2, repeatedValue: 0) // 2x2 with repeatedValue 0
[Double].bidimensional(5, 1, repeatedValue: 2.1) // 5x1 with repeatedValue 2.1

------ 

struct MyCustomStruct {
    var variable: String
}

var myCustomStruct = MyCustomStruct(variable: "repeat")

var arr = [MyCustomStruct].bidimensional(2, 2, repeatedValue: myCustomStruct)

print(arr[0][1].variable) // "repeat"

更新 2

class MyClass {
    var arr = [[String]]()

    func fill2DArrayInLoop() {
        arr = [String].bidimensional(2, 2, repeatedValue: "")
        for i in 0...1 {
            for j in 0...1 {
                arr[i][j] = "row: \(i); col: \(j)"
            }
        }
    }
}

let myClass = MyClass()
myClass.fill2DArrayInLoop()
print(myClass.arr[0][1]) // "row: 0, col: 1" 


找到更好的方法 (see this answer):

class MyClass {
    var arr = Array(count: 2, repeatedValue: Array(count: 2, repeatedValue: ""))

    func fill2DArrayInLoop() {
        for i in 0...1 {
            for j in 0...1 {
                arr[i][j] = "row: \(i); col: \(j)"
            }
        }
    }
}

let myClass = MyClass()
myClass.fill2DArrayInLoop()
print(myClass.arr[0][1]) // "row: 0, col: 1" 

现在您不需要创建 extension。只需将另一个数组声明放入 repeatedValue: 参数即可。