【发布时间】:2023-03-12 18:51:01
【问题描述】:
我正在尝试为书中的 Matrix 示例编写扩展,slightly tweaked to be generic。
我正在尝试编写一个名为 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> (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
【问题讨论】:
标签: generics map generator swift for-in-loop