Я пытаюсь написать расширение для Matrix
примера из книги, слегка изменено, чтобы быть общим.
Я пытаюсь написать метод под названием getRow
, который возвращает последовательность значений в данной строке.
В С# я бы написал следующее:
IEnumerable<T> GetRow (int row)
{
return Enumerable
.Range (0, this.columns)
.Select ((column) => this.grid[row, columns]);
}
или, альтернативно,
IEnumerable<T> GetRow (int row)
{
for (var column = 0; column < this.columns; column++) {
yield return this.grid[row, column];
}
}
Я не уверен, как это сделать в Swift, хотя.
Sequence
кажется эквивалентным IEnumerable<T>
, но я не понимаю, почему он использует typealias
вместо того, чтобы просто определяться как Sequence<T>
(см. также это). Определение метода, возвращающего общий Sequence<T>
, не работает:
extension Matrix {
// Cannot specialize non-generic type 'Sequence'
func getRow<T>(index: Int) -> Sequence<T> {
return map(0..self.columns, { self[index, $0] })
}
}
Затем я избавился от <T>
(но как он должен быть общим?):
extension Matrix {
func getRow(index: Int) -> Sequence {
return map(0..self.columns, { self[index, $0] })
}
}
Это компилируется! Однако я не могу его использовать:
var row = grid.getRow(0)
// 'Sequence' does not conform to protocol '_Sequence_'
for i in row {
println("\(i)")
}
Как правильно напечатать результат map
, чтобы его можно было использовать в цикле for..in
?
Подробнее об этой проблеме: Связанный тип считается странным