夫特二维数组:用于行平等权利和列

问题描述:

给出的简单2D阵列...夫特二维数组:用于行平等权利和列

let grid = [[Cell]]() 

...并与Cells填充由10列的矩阵以创建10行。我可以通过以下方式访问网格的第7行...

let rowSeven = grid[6] 

提取所有第7列的最简单方法是什么?我知道这可以通过遍历每行并提取每行中的第七项来完成,但我正在寻找可以以相同方式处理行和列的答案。

我特别开放使用替代的2D阵列的想法,因为在将来我可能要在网格独立的它们处于哪个行或列映射和过滤器单元。

+1

比较https://*.com/questions/35244584/get-column-from-2d-array-how-to-restrict-array-type-in​​-extension –

+0

谢谢。看起来我需要深入了解Swift中的集合。 –

+0

你引用的答案不会以同样的方式(按照我的问题)处理行和列,而是向集合添加一个扩展,它将列视为与行根本不同的东西(并简单地用行替换循环行等效映射函数)。行和列之间的区别纯粹是二维数组在Swift中工作的方式。因此,我认为应该有可能创建一个反映这一点的模型。 (我只是还没有解决如何) –

我认为你应该创建你自己的类型(struct)来呈现你正在寻找的接口。然后,您可以实现所需的结构,并将其更改为适合您的需要,而无需更改使用该结构的代码。我希望等的接口:

struct Grid<T> { 
    func at(x: Int, y: Int) -> T 
    func at(x: Int) -> [T] 
    func at(y: Int) -> [T] 
    // add setters as necessary. 
} 

您可以实现用一个二维数组,上面像你已经有任何一列重大或列重大,或者作为一维数组,或作为稀疏阵列(即字典,其中键是X,Y元组和值是T.

更重要的是,你可以测试出这些创意的性能和使用适合您的情况最好了一个没有不必更改代码使用你的网格结构

你可以使用自定义函数extension获得专栏。

细胞:

struct Cell{ 

    var id:Int? 
    var fruit:String? 

    init(id:Int?,fruit:String?){ 

     self.id = id 
     self.fruit = fruit 
    } 
} 

2D阵列:

var grid = [[Cell]]() 

插入值(10×10矩阵):

for i in 0...9{ 

    var row = [Cell]() 

    for j in 0...9{ 

     let cell = Cell(id: (i*10)+j, fruit: "Mango \(String(i))") 
     row.append(cell) 
    } 

    self.grid.append(row) 
} 

现在,网格变,

enter image description here

要提取矩阵的所有行7列,

for (index,_) in self.grid.enumerated(){ 

    print(self.grid[index][7]) 
} 

灵活的方式:

雨燕3.0的扩展:

extension Sequence where Iterator.Element == [Cell]{ //Swift 3.0 

    func getColumn(_ column:Int)->[Cell]?{ 

     var cell = [Cell]() 
     for value in self{ 

      if value.count > column{ 
       cell.append(value[column]) 
      }else{ 
       return nil 
      } 
     } 
     return cell 
    } 

} 

斯威夫特4。0扩展:

extension Array where Element == [Cell]{ 

    func getColumn(_ column:Int) -> [Cell]? { 

     var cell = [Cell]() 
     for (index,_) in self.enumerated(){ 

      if index > column { 
       cell.append(self[index][column]) 
      } else { 
       return nil 
      } 
     } 
     return cell 
    } 
} 

获得列:

一个)

print(self.grid.getColumn(7) ?? "Column not found") 

B)

if let columnArray = self.grid.getColumn(7){ 

    for cell in columnArray{ 

     print(cell) 
    } 
}else{ 

    print("Column not found!") 
} 

输出:

一个)

enter image description here

B)

细胞(ID:7,水果:芒果0)

细胞(ID:17,水果:芒果1 )

Cell(id:27,fruit:Mango 2)

细胞(ID:37,水果:芒果3)

细胞(ID:47,水果:芒果4)

细胞(ID:57,水果:芒果5)

细胞( ID:67,水果:芒果6)

细胞(ID:77,水果:芒果7)

细胞(ID:87,水果:芒果8)

细胞(ID:97,FR uit:芒果9)

让我知道你需要吗?