我想测试一个函数,传入一个 shuffle 函数,这样我就可以对该函数进行充分的单元测试。换句话说:
func testme(testArr: [Int], shufflefunction : Shufflefunction = .shuffle) -> [Int] {
return tetsArr.shufflefunction
}
我知道语法不正确;这就是问题所在。
shuffle 函数的正确类型是什么,这样我就可以为任何特定的 shuffle 实现创建一个可重用的函数,正如上面函数中传递的那样。
问题的第二部分是如何将标准的 shuffle() 实现作为默认参数传递给测试此函数。
最佳答案
如果您查看 Array.shuffled
,您会发现它实际上是一个接受数组并返回 () -> [T]
的函数:
因此,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
(变异版本),因为 Swift 不支持变异函数的部分应用。
你也可以将参数类型写成([T]) -> [T]
,那么你就必须像这样传递默认参数:
func testShuffle<T>(array: [T], function: ([T]) -> [T] = { $0.shuffled() }) {
let shuffledArray = function(array)
}
关于Swift 类型的 shuffle(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56404419/