Swift 类型的 shuffle()

标签 swift

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

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

我知道语法不正确;这就是问题所在。

shuffle 函数的正确类型是什么,这样我就可以为任何特定的 shuffle 实现创建一个可重用的函数,正如上面函数中传递的那样。

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

最佳答案

如果您查看 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(变异版本),因为 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/

相关文章:

ios - 未知类型名称 'AFNetworkReachabilityStatus',RestKit 突然停止工作

ios - 如何在 IBAction 中运行委托(delegate)方法?

ios - 核心数据 swift : How to save and load data?

ios - Realm 和解析集成 : how to save the realm

json - 从 Firebase remoteMessage 中的嵌套 JSON 中提取数据

swift - Swift 4 的简单分页功能

ios - 来自调试器 : Terminated due to memory issue While scrolling in UITableView/UICollectionView with gif images Kingfisher Library 的消息

ios - 在 Swift 中存储大数据的最佳方式

iOS 操作扩展加载时间慢

ios - 如何在使用移动视觉人脸检测器时点击 UIView 进行捕获