【问题标题】:Swift method on generic 2 dimensional Array通用二维数组上的 Swift 方法
【发布时间】:2018-05-04 13:58:58
【问题描述】:

当数组是二维数组时,我想在 Array 类型上创建一个扩展方法,例如。 [[Int]],但类型应该是通用的。我正在尝试做这样的事情:

extension Array [where Element : ???] {

  public func transposed() -> ??? {
     // ...
  }
}

【问题讨论】:

标签: swift generics


【解决方案1】:

这在 Swift 4 中有效。

extension Array where Element: Collection {

    public func transposed() -> [[Element.Iterator.Element]] {
        var result : [[Element.Iterator.Element]] = [[]]
        for row in self {
            for (y,column) in row.enumerated() {
                while (result.count <= y) {
                    result.append([])
                }
                result[y].append(column)
            }
        }
        return result
    }
}

然后单元测试也通过了:

func testTransposed() {
    XCTAssertEqual([[1]].transposed(), [[1]])
    XCTAssertEqual([[1,2,3],[4,5]].transposed(), [[1,4],[2,5],[3]])
    XCTAssertEqual([[4,1],[5,2],[3]].transposed(),[[4,5,3],[1,2]])
    XCTAssertEqual([[1,2,3]].transposed(), [[1],[2],[3]])
    XCTAssertEqual([[1],[2],[3]].transposed(),[[1,2,3]])
}

【讨论】:

    【解决方案2】:

    你可以这样做:

    extension Array
    {
       func transposed<T>() -> [[T]] where Element == Array<T>
       {
          return self[0].indices.map{ i in self.map{$0[i]} }
       }
    }
    
    let a = [ [1,2,3],
              [4,5,6],
              [7,8,9] ]
    for r in a.transposed() {print(r)}
    
    // [1, 4, 7]
    // [2, 5, 8]
    // [3, 6, 9]
    // note that the matrix cannot be sparse
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-07
      • 2014-05-23
      • 2013-10-13
      • 1970-01-01
      • 2014-09-27
      • 2018-08-31
      • 2017-10-02
      • 1970-01-01
      相关资源
      最近更新 更多