Swift31/90Days - objc.io 的 Swift 片段 2

发布时间:2019-06-21 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Swift31/90Days - objc.io 的 Swift 片段 2脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

Swift90Days - objc.io 的 Swift 片段 2

函数式快排

结合前面的 decompose 扩展,我们可以分分钟写出一个快排片段。先取出第一个元素作为点,然后把后面小于这个数的放到一个数组里,大于这个数的放到另一个数组里:

extension Array {
    VAR decompose : (head: T, tail: [T])? {
        return (count > 0) ? (self[0], Array(self[1..<count])) : nil
    }
}

func qsort(input: [Int]) -> [Int] {
    if let (pivot, rest) = input.decompose {
        let lesser = rest.filter { $0 < pivot }
        let greater = rest.filter { $0 >= pivot }
        return qsort(lesser) + [pivot] + qsort(greater)
    } else {
        return []
    }
}

qsort([2,4,6,3,5,1])    // 1,2,3,4,5,6

压缩映射数组

在函数式编程里,map 是个十分常见的操作。如果 map 操作的结果是一个数组,我们通常需要对这个数组进行压缩降维操作,在其他函数式语言中压缩后再映射的操作通常命名为 bind ,在 Swift 中可以定义这样的运算符:

infix operator >>= {}
func >>=<A, B>(xs: [A], f: A -> [B]) -> [B] {
    return xs.map(f).reduce([], combine: +)
}

用起来也很简单:

let ranks = ["A", "K", "Q", "J", "10",
             "9", "8", "7", "6", "5", 
             "4", "3", "2"]
let suits = ["♠", "♥", "♦", "♣"]

let allCards =  ranks >>= { rank in
    suits >>= { suit in [(rank, suit)] }
} 

// Prints: [(A, ♠), (A, ♥), (A, ♦), 
//          (A, ♣), (K, ♠), ...

References

脚本宝典总结

以上是脚本宝典为你收集整理的Swift31/90Days - objc.io 的 Swift 片段 2全部内容,希望文章能够帮你解决Swift31/90Days - objc.io 的 Swift 片段 2所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。