【发布时间】:2015-11-22 14:28:45
【问题描述】:
例如,假设
var hierarchicalFileSystem: [[String]] = []
这允许我们支持一层文件夹,但似乎没有办法在 Swift 中创建像上面那样的数组,但嵌套的字符串数组的数量未定义。
我错过了什么吗?
【问题讨论】:
标签: arrays swift multidimensional-array filesystems dynamic-programming
例如,假设
var hierarchicalFileSystem: [[String]] = []
这允许我们支持一层文件夹,但似乎没有办法在 Swift 中创建像上面那样的数组,但嵌套的字符串数组的数量未定义。
我错过了什么吗?
【问题讨论】:
标签: arrays swift multidimensional-array filesystems dynamic-programming
字符串数组(数组的数组...)对于表示文件系统并没有多大意义。
我建议创建一个类或结构来表示文件系统中的对象。也许是这样的:
struct FileSystemObject {
let name: String
let extension: String?
let isFolder: Bool
let contents: [FileSystemObject]?
}
这样的东西让我们可以很好地表示一个文件系统。
let fileSystem = [FileSystemObject]()
所以,这里的 fileSystem 变量是 FileSystemObjects 的数组,它代表根。根目录中的每个对象都有自己的一组详细信息(它的名称、它的文件扩展名(如果有的话)以及它是否是一个文件夹),如果它是一个文件夹它有一个非零contents 属性,如果这是一个非空文件夹,FileSystemObjects 的 contents 数组包含更多文件系统对象(其中一些当然是文件夹,其中包含内容本身)。
【讨论】:
你可以做的是用 AnyObject 创建一个数组,并根据需要添加新的深度
var fileSystem: [AnyObject] = []
但是,这将是表示文件系统的一种非常糟糕的方式,您应该使用某种树结构,例如
struct Node {
children: [Node]?
parent: Node?
name: String
}
【讨论】:
[Node] 的数组中。不要忽视 Swift 的类型安全性给你带来的所有优势......
struct,则父对象需要是weak.
Swift 是类型安全的语言。您必须声明变量的类型,或将其设置为AnyObject,但请不要这样做。所以,回答你的问题:是的有可能:
var array: [AnyObject] = [[[1,2,3], [1,2,3]], [[1,2,3],[1,2,3]]]
但这太糟糕了。尝试为您的问题找出更好的表示。也许是自定义结构。
【讨论】:
您可以拥有任意多的维度数组。这是个好主意吗?我不认为...
var threeDArray: Array<Array<Array<String>>> = []
let oneDArray = ["1","2","3"]
let twoDArray1: Array<Array<String>> = [oneDArray, oneDArray, oneDArray, oneDArray, oneDArray]
let twoDArray2 = twoDArray1 + [["4","5","6"],["7","8","9"]]
threeDArray.append(twoDArray1)
threeDArray.append(twoDArray2)
let arr = [threeDArray,threeDArray,threeDArray]
print(arr.dynamicType) // Array<Array<Array<Array<String>>>>
【讨论】: