swift2 - Swift for-in loop with enumerate on custom Array2D class? -


how go implementing custom enumerate function makes work (swift 2):

for ((column, row), item) in array2d.enumerate() { ... } 

in simple array2d struct:

struct array2d<t> : sequencetype {     let columns: int     let rows: int     private var array: array<t?>      init(columns: int, rows: int) {         self.columns = columns         self.rows = rows         array = array(count: rows*columns, repeatedvalue: nil)     }      subscript(column: int, row: int) -> t? {         {             return array[columns*row + column]         }         set {             array[columns*row + column] = newvalue         }     }      func generate() -> anygenerator<t?> {         var column = 0         var row = 0          return anygenerator() {             guard row < self.rows else {                 return nil             }              let item = self[column, row]              if ++column == self.columns {                 column = 0                 ++row             }              return item         }     } } 

i couldn't find explanation on implementing enumerate function in swift

it might suffice defining own enumerate taking advantage of 1 have:

func enumerate() -> anygenerator<((int, int), t?)> {     var index = 0     var g = array.generate()     return anygenerator() {         if let item = g.next() {             let column = index % self.columns             let row = index / self.columns             ++index             return ((column, row) , item)         }         return nil     } } 

notice in case avoid conforming sequencetype since use generate private array. anyway consistent so.

here how use it:

var a2d = array2d<int>(columns: 2, rows: 4) a2d[0,1] = 4  ((column, row), item) in a2d.enumerate() {     print ("[\(column) : \(row)] = \(item)") } 

hope helps


Comments