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
Post a Comment