ios - 二维数组的数据结构

标签 ios arrays swift data-modeling

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

我已经尝试了所有可能的数据结构,但它们似乎都不起作用。

例如,如果我声明

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向现有类、结构或枚举类型添加新功能。在我们的例子中,我们使用函数biDimension扩展Array类型。 static 意味着它是 type 方法,而不是 instance 方法。 T 表示它是 generic方法。在这种情况下,您不仅可以使用一种特定类型(例如 String)来调用您的biDimension 函数,还可以使用您想要的任何类型(StringIntDouble 等)。嗯,二维的函数代码非常简单。我们只是用我们的自定义 (T) 类型创建空的 2D resultArray。然后我们用我们的 repeatedValue 填充这个数组并返回它。就这些。
附言为了清楚泛型,有几个例子:

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

this comment 的更新 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" 

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

关于ios - 二维数组的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415321/

相关文章:

ios - 单个选项卡栏项目根据条件呈现不同的 View Controller ?

c - 在 Swift 中,为什么 char * 变成了 UnsafePointer<Int8>?

ios - UINavigationController 不是全屏(swift)

JavaScript 对象按日期排序

Javascript - 不重复代码的随机报价生成器

java - 用空格替换整数

ios - 在 HKHealthStore 更新锻炼

html - 使用 Bootstrap 的 iOS 复选框不会居中

ios - 导航堆栈不会更新,从 GMSAutocompleteResultsViewController 继续

swift - 如何更改 UserDefaults 中的值的类型?