使用不同的数据类型在 swift 中创建多维数组
Create multidimentional array in swift with different datatypes
这是我的第一个问题,如果不是很清楚请见谅。
我正在尝试在 swift 中创建一个数组,它将存储数组的数组或整数。
该数组应该是我将使用的数据的简单表示,它基本上是一种树状数据结构,就像这样...
数组 = [ [[ [2, 3] ], [ 1, 4 ], [ 2 ]],
[ 2 ], [[2, 5], [6, 1] ], 3 ]
总的来说,数组是分支,整数是叶子
我试过像这样将它们声明为可选项
var test2 = [[[Int]?]?]()
或者使用 typedef,但我仍然无法让它工作。
此外,应该可以向任何数组添加新叶子
这里是基于enum
的解决方案,首先声明enum
:
enum Node
{
case leaf(Int)
case branch([Node])
}
您现在可以编写如下内容:
let x = Node.leaf(42)
let y = Node.branch([Node.leaf(42), Node.leaf(24)])
但是这很快就会变得很费力。幸运的是 Swift 允许从文字转换,所以我们添加:
extension Node : ExpressibleByIntegerLiteral
{
init(integerLiteral value: Int)
{
self = .leaf(value)
}
}
extension Node : ExpressibleByArrayLiteral
{
init(arrayLiteral elements: Node...)
{
self = .branch(elements)
}
}
加上这些,我们现在可以将上面的两个 let
语句写成:
let x : Node = 42
let y : Node = [42, 24]
哪个更好。然而,如果我们 print(y)
我们得到:
branch([Node.leaf(42), Node.leaf(24)])
如果你想要漂亮的打印,你可以添加:
extension Node : CustomStringConvertible
{
var description : String
{
switch self
{
case .leaf(let value):
return value.description
case .branch(let branches):
return branches.description
}
}
}
现在 print(y)
给你:
[42, 24]
最后是你的例子:
let w : Node = [[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
打印为:
[[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
您需要使用 isLeaf
等谓词来完成 enum
类型,但这是基本思想。
HTH
这是我的第一个问题,如果不是很清楚请见谅。
我正在尝试在 swift 中创建一个数组,它将存储数组的数组或整数。 该数组应该是我将使用的数据的简单表示,它基本上是一种树状数据结构,就像这样...
数组 = [ [[ [2, 3] ], [ 1, 4 ], [ 2 ]], [ 2 ], [[2, 5], [6, 1] ], 3 ]
总的来说,数组是分支,整数是叶子
我试过像这样将它们声明为可选项
var test2 = [[[Int]?]?]()
或者使用 typedef,但我仍然无法让它工作。
此外,应该可以向任何数组添加新叶子
这里是基于enum
的解决方案,首先声明enum
:
enum Node
{
case leaf(Int)
case branch([Node])
}
您现在可以编写如下内容:
let x = Node.leaf(42)
let y = Node.branch([Node.leaf(42), Node.leaf(24)])
但是这很快就会变得很费力。幸运的是 Swift 允许从文字转换,所以我们添加:
extension Node : ExpressibleByIntegerLiteral
{
init(integerLiteral value: Int)
{
self = .leaf(value)
}
}
extension Node : ExpressibleByArrayLiteral
{
init(arrayLiteral elements: Node...)
{
self = .branch(elements)
}
}
加上这些,我们现在可以将上面的两个 let
语句写成:
let x : Node = 42
let y : Node = [42, 24]
哪个更好。然而,如果我们 print(y)
我们得到:
branch([Node.leaf(42), Node.leaf(24)])
如果你想要漂亮的打印,你可以添加:
extension Node : CustomStringConvertible
{
var description : String
{
switch self
{
case .leaf(let value):
return value.description
case .branch(let branches):
return branches.description
}
}
}
现在 print(y)
给你:
[42, 24]
最后是你的例子:
let w : Node = [[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
打印为:
[[[[2, 3]], [1, 4], [2]], [2], [[2, 5], [6, 1]], 3]
您需要使用 isLeaf
等谓词来完成 enum
类型,但这是基本思想。
HTH