Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何在Swift中返回序列?_Generics_Map_Generator_Swift_For In Loop - Fatal编程技术网

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] }))
        }
    }