Swift - 带双括号的函数?

时间:2015-11-10 14:51:41

标签: swift

当阅读关于RxSwift的Custom operators时,我注意到这个func有两个参数定义。

func myMap<E, R>(transform: E -> R)(source: Observable<E>) -> Observable<R> {
    return create { observer in

        let subscription = source.subscribe { e in
                switch e {
                case .Next(let value):
                    let result = transform(value)
                    observer.on(.Next(result))
                case .Error(let error):
                    observer.on(.Error(error))
                case .Completed:
                    observer.on(.Completed)
                }
            }

        return subscription
    }
}

我以前见过这个语法。我甚至不知道如何google它。 如果你能给我一些正式的文件链接,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

正如评论中所提到的,这将被称为Curried Functions

基本上,它使您能够动态创建函数,而不是函数在发送所有参数时所具有的特性。

示例时间(这是一个相当愚蠢的例子,但它应该让你知道currying的作用)

func addNumbers(a a: Int, b: Int) -> Int {
    return a + b
}

func addNumbers(a a: Int)(b: Int) -> Int {
    return a + b
}

//usage normal function
var two = addNumbers(a:1, b:1)
var three = addNumbers(a:1, b:2)
var four = addNumbers(a:1, b:3)

//usage curried function
var addOne = addNumbers(a:1)
var two = addOne(b:1)
var three = addOne(b:2)
var four = addOne(b:3)

因此,如果你遇到一些问题,你知道在一些特定情况下你的一个参数会有一个值,但在另一个情况下另一个值你可以省去发送这些参数,而只是创建它的功能将会被使用。

再次如上所述,这是一个愚蠢的例子,但在编写REST api作为示例时它非常有用。你有相同的功能应用于许多不同的类型,可以用相同的一般方式保存。

另一个用法示例Logger implemented with Currying

在您的示例中,可以首先应用映射对象的函数,然后可以将创建的映射函数应用于应映射的源。

您可以详细了解herehere