代码之家  ›  专栏  ›  技术社区  ›  stevenpcurtis

快速洗牌()

  •  0
  • stevenpcurtis  · 技术社区  · 6 年前

    我想测试一个函数,传入一个shuffle函数,这样就可以对函数进行充分的单元测试。换句话说:

    func testme(testArr: [Int], shufflefunction : Shufflefunction = .shuffle) -> [Int] {
        return tetsArr.shufflefunction
    }
    

    问题的第二部分是如何将标准shuffle()实现作为测试此函数的默认参数传递。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Sweeper    6 年前

    如果你看 Array.shuffled () -> [T] :

    enter image description here

    Array.shuffled数组 可以写成

    (([T]) -> (() -> [T]))
    

    然后我们可以将其用作参数类型:

    func testShuffle<T>(array: [T], function: (([T]) -> (() -> [T])) = Array.shuffled) {
        let shuffleFunction = function(array)
        let shuffledArray = shuffleFunction()
        // do stuff with shuffledArray...
    }
    
    // usage
    extension Array {
        func myCustomShuffled() -> [Element] {
            // ...
        }
    }
    
    let arr = [1,2,3,4,5,6,7]
    testShuffle(array: arr, function: Array.myCustomShuffled)
    

    请注意,相同的方法不适用于 Array.shuffle

    也可以将参数类型写入 ([T]) -> [T] ,则必须像这样传递默认参数:

    func testShuffle<T>(array: [T], function: ([T]) -> [T] = { $0.shuffled() }) {
        let shuffledArray = function(array)
    }