二维数组的数据结构

时间:2015-09-05 16:31:24

标签: ios arrays swift data-modeling

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

我已尝试过任何可能的数据结构,但它们似乎都没有工作。

例如,如果我声明

var array = [[String]]()

当我尝试追加元素时,应用会崩溃,例如

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

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

我认为这很容易实现,但我遇到了很多问题,有什么解决方案吗?

1 个答案:

答案 0 :(得分:1)

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

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为现有的类,结构或枚举类型添加新功能。在我们的示例中,我们使用函数Array扩展bidimensional类型。 static表示它是type方法,而不是instance方法。 T表示它是generic方法。在这种情况下,您不仅可以使用一种特定类型(例如bidimensional)调用String函数,还可以调用您想要的任何类型(StringInt,{{1等等)。好吧,Double的功能代码非常简单。我们只使用自定义(bidimensional)类型创建空2D resultArray。然后我们用T填充这个数组并返回它。多数民众赞成。
附:要弄清楚泛型,有几个例子:

repeatedValue

this comment的更新2。

[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"

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

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" 

现在您不需要创建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参数。