我尝试掌握 Argo 进行 json 解码。在文档中有解码功能的例子
extension User: Decodable {
static func decode(j: JSON) -> Decoded<User> {
return curry(User.init)
<^> j <| "id"
<*> j <| "name"
}
}
是什么<^>
意思<*>
?它们之间有什么区别?
根据Github 文档...
<^>
是map
函数
和
<*>
是apply
函数
这两个都在这里描述...... https://robots.thoughtbot.com/functional-swift-for-dealing-with-optional-values
从 Github 页面链接。
注意阅读文档:)
tldr,<^>
用于第一个参数并<*>
用于之后的每个参数。
长答案:
<^>
与 Swift 的map
功能相同。它是从 Haskell(一种纯函数式编程语言)借来的运算符。虽然,在 Haskell 中它实际上是<$>
,但 Swift 不能$
在其运算符中使用,所以我们(和社区中的其他人)选择了<^>
。
<^>
,又名map
,将函数应用于上下文中的值。该上下文可以是Optional
、Array
、Dictionary
或许多其他上下文。在 的上下文中Optional
,<^>
会将第一个参数(运算符左侧)中的函数应用于第二个参数(运算符右侧)中的可选值。结果将是.none
如果可选值是.none
或者在将其传递给函数后展开的可选值的结果在.some(x)
哪里。x
我希望这是有道理的。如果<*>
是这样,除了第一个参数中的函数也被包装在一个上下文中(如Optional
. 所以你有一个Optional
函数和一个Optional
值,然后你会使用<*>
. 这就是我们在第一次使用<*>
之后使用<^>
的原因,因为在第一次 , 之后<^>
,map
我们留下了一个部分应用的构造函数(一个函数),它已经被包装在上下文中<^>
。
<*>
也取自 Haskell。在 Haskell 中,它被调用Applicative
并使用完全相同的运算符。