【问题标题】:How would you create a multidimensional array with n dimensions in Swift?你将如何在 Swift 中创建一个具有 n 维的多维数组?
【发布时间】:2015-11-22 14:28:45
【问题描述】:

例如,假设

var hierarchicalFileSystem: [[String]] = []

这允许我们支持一层文件夹,但似乎没有办法在 Swift 中创建像上面那样的数组,但嵌套的字符串数组的数量未定义。

我错过了什么吗?

【问题讨论】:

    标签: arrays swift multidimensional-array filesystems dynamic-programming


    【解决方案1】:

    字符串数组(数组的数组...)对于表示文件系统并没有多大意义。

    我建议创建一个类或结构来表示文件系统中的对象。也许是这样的:

    struct FileSystemObject {
        let name: String
        let extension: String?
        let isFolder: Bool
        let contents: [FileSystemObject]?
    }
    

    这样的东西让我们可以很好地表示一个文件系统。

    let fileSystem = [FileSystemObject]()
    

    所以,这里的 fileSystem 变量是 FileSystemObjects 的数组,它代表根。根目录中的每个对象都有自己的一组详细信息(它的名称、它的文件扩展名(如果有的话)以及它是否是一个文件夹),如果它是一个文件夹它有一个非零contents 属性,如果这是一个非空文件夹,FileSystemObjects 的 contents 数组包含更多文件系统对象(其中一些当然是文件夹,其中包含内容本身)。

    【讨论】:

    • 是的,这会更好,谢谢。但是,我认为数组会更有效,是吗?
    • 什么更高效?实际上,如果不执行此类操作,您就无法真正表示文件结构。如果您只想要纯数组,那么您唯一可以表示的是实际的非文件夹文件——不可能表示该文件夹的文件路径。字符串数组(数组的数组......)无法表示任何文件夹名称。
    【解决方案2】:

    你可以做的是用 AnyObject 创建一个数组,并根据需要添加新的深度

    var fileSystem: [AnyObject] = []
    

    但是,这将是表示文件系统的一种非常糟糕的方式,您应该使用某种树结构,例如

    struct Node {
        children: [Node]?
        parent: Node?
        name: String 
    }
    

    【讨论】:

    • 如果我要使用这样的东西来创建文件系统的快照,然后将结果存储在 AnyObject 数组中,那会更好吗?
    • 比什么好?如果你使用它,你应该将它存储在[Node] 的数组中。不要忽视 Swift 的类型安全性给你带来的所有优势......
    • @BrandonBradley 还值得注意的是,如果您使用某种数据结构来维护指向父对象的指针,如果您使用类而不是 struct,则父对象需要是weak.
    • 这将 1) 访问速度更快,2) 使用更少的内存。据我了解,使用我描述的数组方法是可能的,但是在这种情况下,复杂性和效率之间的权衡是不值得的。
    • @BrandonBradley 无法使用数组方法并跟踪文件夹的名称。您只能跟踪文件(或潜在的空文件夹)。您的数组代表文件夹,其中的字符串代表文件。您的数组不能有名称,因此使用多维数组只能跟踪所有文件是什么,以及它们相对于其他文件的位置,以及匿名文件夹......这对您有用吗?
    【解决方案3】:

    Swift 是类型安全的语言。您必须声明变量的类型,或将其设置为AnyObject,但请不要这样做。所以,回答你的问题:是的有可能:

    var array: [AnyObject] = [[[1,2,3], [1,2,3]], [[1,2,3],[1,2,3]]]
    

    但这太糟糕了。尝试为您的问题找出更好的表示。也许是自定义结构。

    【讨论】:

      【解决方案4】:

      您可以拥有任意多的维度数组。这是个好主意吗?我不认为...

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

      【讨论】:

      • 这并不能解决问题。他正在寻找如何创建动态数量的维度。您的解决方案创建了三个维度而不是两个维度,但它仍然不是动态的。
      猜你喜欢
      • 2019-04-29
      • 2018-01-07
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多