2017-08-06 35 views
0

給出的簡單2D陣列...夫特二維數組:用於行平等權利和列

let grid = [[Cell]]() 

...並與Cells填充由10列的矩陣以創建10行。我可以通過以下方式訪問網格的第7行...

let rowSeven = grid[6] 

提取所有第7列的最簡單方法是什麼?我知道這可以通過遍歷每行並提取每行中的第七項來完成,但我正在尋找可以以相同方式處理行和列的答案。

我特別開放使用替代的2D陣列的想法,因爲在將來我可能要在網格獨立的它們處於哪個行或列映射和過濾器單元。

+1

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

+0

謝謝。看起來我需要深入瞭解Swift中的集合。 –

+0

你引用的答案不會以同樣的方式(按照我的問題)處理行和列,而是向集合添加一個擴展,它將列視爲與行根本不同的東西(並簡單地用行替換循環行等效映射函數)。行和列之間的區別純粹是二維數組在Swift中工作的方式。因此,我認爲應該有可能創建一個反映這一點的模型。 (我只是還沒有解決如何) –

回答

0

我認爲你應該創建你自己的類型(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.

更重要的是,你可以測試出這些創意的性能和使用適合您的情況最好了一個沒有不必更改代碼使用你的網格結構

0

你可以使用自定義函數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)

讓我知道你需要嗎?