我正在嘗試從書籍slightly tweaked to be generic中爲Matrix
示例編寫一個擴展。
我正在嘗試編寫一個名爲getRow
的方法,該方法返回給定行處的值序列。如何在Swift中返回一個序列?
在C#中,我會寫這樣的:
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];
}
}
我不知道如何在斯威夫特這樣做雖然。
Sequence
似乎是相當於IEnumerable<T>
,但我不明白爲什麼它使用typealias
,而不是僅僅被定義爲Sequence<T>
(see also this)。定義返回通用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
循環消耗?
更多關於這個問題:Associated Type Considered Weird
感謝所有這些鏈接 - 非常感謝。 – ColinE
不要忘記SequenceOf已從最新版本的Swift中刪除。 –