当阅读关于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它。 如果你能给我一些正式的文件链接,我将不胜感激。
答案 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
在您的示例中,可以首先应用映射对象的函数,然后可以将创建的映射函数应用于应映射的源。