Ich versuche, eine Erweiterung für das Matrix
Beispiel aus dem Buch, slightly tweaked to be generic zu schreiben.
Ich versuche, eine Methode namens getRow
zu schreiben, die eine Sequenz von Werten in der angegebenen Zeile zurückgibt.Wie gebe ich eine Sequenz in Swift zurück?
In C#, würde ich dieses geschrieben habe:
IEnumerable<T> GetRow (int row)
{
return Enumerable
.Range (0, this.columns)
.Select ((column) => this.grid[row, columns]);
}
oder alternativ
IEnumerable<T> GetRow (int row)
{
for (var column = 0; column < this.columns; column++) {
yield return this.grid[row, column];
}
}
Ich bin mir nicht sicher, wie dies obwohl in Swift zu tun.
Sequence
scheint das Äquivalent zu IEnumerable<T>
zu sein, aber ich verstehe nicht, warum es typealias
statt nur wird definiert als Sequence<T>
(see also this) verwendet. Definieren einer Methode, die generische Sequence<T>
kehrt nicht funktioniert:
extension Matrix {
// Cannot specialize non-generic type 'Sequence'
func getRow<T>(index: Int) -> Sequence<T> {
return map(0..self.columns, { self[index, $0] })
}
}
Dann habe ich los <T>
(aber, wie es sein generic soll?):
extension Matrix {
func getRow(index: Int) -> Sequence {
return map(0..self.columns, { self[index, $0] })
}
}
Dies kompiliert! Allerdings kann ich es nicht verwenden:
var row = grid.getRow(0)
// 'Sequence' does not conform to protocol '_Sequence_'
for i in row {
println("\(i)")
}
Wie kann ich geben richtig map
Ergebnis so kann es in einer for..in
Schleife verbraucht werden?
Mehr zu diesem Thema: Associated Type Considered Weird
Danke für all diese Links - sehr geschätzt. – ColinE
Vergessen Sie nicht, dass SequenceOf aus den letzten Versionen von Swift entfernt wurde. –