Sto provando a scrivere un'estensione per l'esempio Matrix
dal libro, slightly tweaked to be generic.
Sto provando a scrivere un metodo chiamato getRow
che restituisce una sequenza di valori nella riga specificata.Come si restituisce una sequenza in Swift?
In C#, avrei scritto questo:
IEnumerable<T> GetRow (int row)
{
return Enumerable
.Range (0, this.columns)
.Select ((column) => this.grid[row, columns]);
}
o in alternativa
IEnumerable<T> GetRow (int row)
{
for (var column = 0; column < this.columns; column++) {
yield return this.grid[row, column];
}
}
Non sono sicuro di come fare questo a Swift però.
Sequence
sembra essere l'equivalente di IEnumerable<T>
, ma non capisco il motivo per cui utilizza typealias
invece di essere definita come Sequence<T>
(see also this). Definizione di un metodo che restituisce generico Sequence<T>
non ha funzionato:
extension Matrix {
// Cannot specialize non-generic type 'Sequence'
func getRow<T>(index: Int) -> Sequence<T> {
return map(0..self.columns, { self[index, $0] })
}
}
Poi mi sono liberato di <T>
(ma come si suppone che sia generica?):
extension Matrix {
func getRow(index: Int) -> Sequence {
return map(0..self.columns, { self[index, $0] })
}
}
Questo compila! Tuttavia non posso usarlo:
var row = grid.getRow(0)
// 'Sequence' does not conform to protocol '_Sequence_'
for i in row {
println("\(i)")
}
Come faccio correttamente digitare map
risultato in modo che possa essere consumato in un ciclo for..in
?
più su questo tema: Associated Type Considered Weird
Grazie per tutti questi link - molto apprezzato. – ColinE
Non dimenticare che SequenceOf è stato rimosso dalle versioni recenti di Swift. –