二维数组的数据结构
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
函数,还可以使用您想要的任何类型(String
、Int
、Double
,等等)。好吧,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:
参数即可。
我有一个字符串数组。 它必须声明为空,然后一次填充一个数组。
我尝试了所有可能的数据结构,但其中 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
函数,还可以使用您想要的任何类型(String
、Int
、Double
,等等)。好吧,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:
参数即可。