Generics 如何在Swift中返回序列?
我正在尝试为书中的Generics 如何在Swift中返回序列?,generics,map,generator,swift,for-in-loop,Generics,Map,Generator,Swift,For In Loop,我正在尝试为书中的矩阵示例编写扩展。 我正在尝试编写一个名为getRow的方法,该方法返回给定行的一系列值 在C#中,我会这样写: IEnumerable<T> GetRow (int row) { return Enumerable .Range (0, this.columns) .Select ((column) => this.grid[row, columns]); } 然后我去掉了(但它怎么会是通用的呢?) 这个编译!但是我
矩阵示例编写扩展。
我正在尝试编写一个名为getRow
的方法,该方法返回给定行的一系列值
在C#中,我会这样写:
IEnumerable<T> GetRow (int row)
{
return Enumerable
.Range (0, this.columns)
.Select ((column) => this.grid[row, columns]);
}
然后我去掉了
(但它怎么会是通用的呢?)
这个编译!但是我不能使用它:
var row = grid.getRow(0)
// 'Sequence' does not conform to protocol '_Sequence_'
for i in row {
println("\(i)")
}
如何正确键入map
结果,以便在for..in
循环中使用它
关于这个问题的更多信息:我认为您被Swift编译器误导了(目前它有点古怪)。您的范围0..self.columns
的类型是range
,它不是序列
或集合
,因此我认为它不能通过映射使用
实施对我来说很有效:
extension Matrix {
func getRow(index: Int) -> T[] {
var row = T[]()
for col in 0..self.columns {
row.append(self[index, col])
}
return row
}
}
Joe Groff将结果包装在SequenceOf
中:
扩展矩阵{
func getRow(索引:Int)->SequenceOf{
返回SequenceOf(映射(0..self.columns,{self[index,$0]}))
}
}
实际上,这是可行的,但我们必须将map
结果包装到一个helper类中,这与我在C#中的做法不同
我必须承认,我还不明白为什么Sequence
和Generator
使用typealias
而不是通用协议(比如C#中的IEnumerable
)。关于这一区别有一个有趣的持续讨论,因此我将为好奇的人留下几个链接:
我会用雷达。。。但是我如何让序列保持懒惰?@Dan他们懒惰吗?如果我在一个数组上执行一个映射,但对结果不做任何处理,那么仍然会对所有数组值执行闭包。真奇怪!我认为,如果它不返回数组,那么它就必须是惰性的。我来检查一下。结果我们需要使用SequenceOf
。请参阅我的更新。别忘了SequenceOf已从最新版本的Swift中删除。
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)")
}
extension Matrix {
func getRow(index: Int) -> T[] {
var row = T[]()
for col in 0..self.columns {
row.append(self[index, col])
}
return row
}
}
extension Matrix {
func getRow(index: Int) -> SequenceOf<T> {
return SequenceOf(map(0..self.columns, { self[index, $0] }))
}
}