我正在尝试编写一个扩展Matrix
书中的例子,稍微调整为通用的 https://stackoverflow.com/q/24136604/458193.
我正在尝试编写一个名为的方法getRow
返回给定行的值序列。
在 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];
}
}
但我不知道如何在 Swift 中做到这一点。
Sequence
似乎相当于IEnumerable<T>
但我不明白它为什么使用typealias
而不是仅仅被定义为Sequence<T>
(另请参阅此 https://schani.wordpress.com/2014/06/03/playing-with-swift/2/)。定义一个返回泛型的方法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
loop?
有关此问题的更多信息:关联类型被认为很奇怪 http://schani.wordpress.com/2014/06/11/associated-types-considered-weird/