Swift使用Swiftz库时<*>操作符特殊函数调用的原理疑问
<*> 操作符运行原理说明
- Swift 允许开发者自定义操作符的类型(前缀、中缀、后缀)、优先级和结合性,
<*>是 Swiftz 库预先定义的中缀操作符,对应函数式编程中 Applicative 函子的「应用」操作,写法上两边加空格和普通的+-等原生中缀操作符用法完全一致,不会触发编译错误。
你给出的 <*> 是针对可选值的重载版本,定义如下:
public func <*> <A, B>(f : ((A) -> B)?, a : A?) -> B? { return f.flatMap { $0 <^> a } }
参数匹配逻辑
- 左参数
Person().walk是已经绑定了实例的实例方法,类型为(Int) -> Void,因为是确定存在的函数,Swift 会自动隐式提升为可选类型((Int) -> Void)?,匹配泛型参数中第一个参数的类型。 - 右参数
10是 Int 类型值,同样会自动隐式提升为可选类型Int?,匹配泛型参数中第二个参数的类型。
内部执行逻辑
- 首先调用
f.flatMap:当前场景下可选函数f就是确定存在的walk函数,flatMap 会解包出函数本身传入闭包,对应闭包里的$0。 - 然后执行
$0 <^> a:<^>是 Swiftz 定义的map操作符,作用等价于 Optional.map,当前场景下可选值a就是确定存在的10,map 操作会把10作为参数传入$0也就是walk函数执行,最终得到和常规调用一致的结果。
这种写法本质是函数式编程里把「函数调用」抽象成操作符的实现,核心优势是在多个可选值嵌套调用的场景下减少可选解包的冗余代码,你给出的示例是该操作符最简单的应用场景。
内容的提问来源于stack exchange,提问作者ImWH
相关产品推荐
相关产品推荐

