我想测试一个函数,传入一个shuffle函数,这样我就可以充分地对该函数进行单元测试。换句话说:
func testme(testArr: [Int], shufflefunction : Shufflefunction = .shuffle) -> [Int] {
return tetsArr.shufflefunction
}我知道语法是不正确的;这就是问题所在。
shuffled函数的正确类型是什么,这样我就可以为任何特定的shuffle实现创建一个可重用的函数,就像在上面的函数中传递的那样。
问题的第二部分是如何将标准的shuffle()实现作为测试此函数的默认参数。
发布于 2019-06-01 15:13:17
如果查看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)
}https://stackoverflow.com/questions/56404419
复制相似问题