Свифт метод на универсальном 2-мерном массиве - PullRequest
0 голосов
/ 04 мая 2018

Я хотел бы создать метод расширения для типа Array, когда массив представляет собой двумерный массив, например. [[Int]], но тип должен быть универсальным. Я пытаюсь сделать что-то вроде этого:

extension Array [where Element : ???] {

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы можете сделать это:

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
0 голосов
/ 04 мая 2018

Это работало в 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]])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...