Swift32/90Days - objc.io 的 Swift 片段 3

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

Swift90Days - objc.io 的 Swift 片段 3

reduce

reduce 是函数式编程里很常用的操作之一。我们可以用 reduce 封装一个简单的求和函数:

let sum: [Int] -> Int = { $0.reduce(0, combine: +) }

println(sum([1,2,3,5]))

开始看可能有点难以理解,把它补全就是这样的:

let sum: [Int] -> Int = { (nums:[Int]) -> Int in
    nums.reduce(0, combine: +)
}

println(sum([1,2,3,5]))

不仅是整数,Bool 值也是可以的:

let all: [Bool] -> Bool = { $0.reduce(true, combine: { $0 && $1 }) }

Applicative Functors

假设我们有这样一个登录的函数:

func LOGin(email: String, pw: String, success: Bool -> ())

由于获取参数的函数可能返回的是可选类型,所以在调用的时候需要挨个解包:

if let email = getEmail() {
    if let pw = getPw() {
        login(email, pw) { println("success: ($0)") }
    } else {
        // error...
    }
} else {
    // error...
}

这个操作十分的繁琐且无意义的多次重复,我们可以通过自定义运算符解决这个问题:

infix operator <*> { associativity left precedence 150 }
func <*><A, B>(lhs: (A -> B)?, rhs: A?) -> B? {
    if let lhs1 = lhs {
        if let rhs1 = rhs {
            return lhs1(rhs1)
        }
    }
    return nil
}

可以看到,我们把解包的操作放到这个操作符里,这样就能避免解包的苦恼:

func curry<A, B, C, R>(f: (A, B, C) -> R) -> A -> B -> C -> R {
    return { a in { b in { c in f(a, b, c) } } }
}

if let f = curry(login) <*> getEmail() <*> getPw() {
    f { println("success ($0)") }
} else {
    // error...
}

References

脚本宝典总结

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

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

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