Próbuję zapisać rozszerzenie dla przykładu Matrix
z książki, slightly tweaked to be generic. Próbuję napisać metodę o nazwie getRow
, która zwraca ciąg wartości w danym wierszu.Jak mogę zwrócić sekwencję w Swift?
W języku C#, bym napisał tak:
IEnumerable<T> GetRow (int row)
{
return Enumerable
.Range (0, this.columns)
.Select ((column) => this.grid[row, columns]);
}
lub alternatywnie
IEnumerable<T> GetRow (int row)
{
for (var column = 0; column < this.columns; column++) {
yield return this.grid[row, column];
}
}
Nie jestem pewien, jak to zrobić w Swift chociaż.
Sequence
wydaje się być równoważne IEnumerable<T>
ale nie rozumiem, dlaczego używa typealias
zamiast po prostu jest zdefiniowany jako Sequence<T>
(see also this). Definiowanie metodę, która zwraca rodzajowe Sequence<T>
nie działa:
extension Matrix {
// Cannot specialize non-generic type 'Sequence'
func getRow<T>(index: Int) -> Sequence<T> {
return map(0..self.columns, { self[index, $0] })
}
}
Potem pozbyła <T>
(ale jak to się ma być generic):
extension Matrix {
func getRow(index: Int) -> Sequence {
return map(0..self.columns, { self[index, $0] })
}
}
kompiluje to! Jednak nie mogę go używać:
var row = grid.getRow(0)
// 'Sequence' does not conform to protocol '_Sequence_'
for i in row {
println("\(i)")
}
Jak poprawnie wpisać map
rezultat dzięki czemu może być spożywany w for..in
pętli?
Więcej na ten temat: Associated Type Considered Weird
Dziękuję za wszystkie te linki - bardzo doceniane. – ColinE
Nie zapomnij, że SequenceOf został usunięty z ostatnich wersji Swift. –