I\'m trying to write an extension for the Matrix
example from the book, slightly tweaked to be generic.
I\'m trying to write a method called getRow
Joe Groff suggested to wrap the result in SequenceOf<T>
:
extension Matrix {
func getRow(index: Int) -> SequenceOf<T> {
return SequenceOf(map(0..self.columns, { self[index, $0] }))
}
}
Indeed, this works but we had to wrap map
result into a helper class which differs from how I do it in C#.
I have to admit I don't yet understand why Sequence
and Generator
use typealias
and aren't generic protocols (like IEnumerable<T>
in C#). There is an interesting ongoing discussion about this distinction so I'll leave a few links for a curious mind:
I think you are being mislead by the Swift compiler (which is a bit flaky at the moment). The type for your range 0..self.columns
is Range<Int>
, which is not a Sequence
or Collection
, so I don't think it can be used via map
.
The implementation works for me:
extension Matrix {
func getRow(index: Int) -> T[] {
var row = T[]()
for col in 0..self.columns {
row.append(self[index, col])
}
return row
}
}