我一直在努力通過Functional Programming in Swift這本書,而我沒有真正理解Optionals章節中介紹的概念的不同之處。Swift函數式編程 - 「可選綁定」與「可選映射」
模式時,與自選的工作往往是:
if let thing = optionalThing {
return doThing(thing)
}
else {
return nil
}
這個成語用標準庫函數map
map(optionalThing) { thing in doThing(thing) }
該書然後繼續並介紹了可選的概念簡潔處理綁定,這是我的區分能力開始崩潰的地方。
這本書指導我們定義map
功能:
func map<T, U>(optional: T?, f: T -> U) -> U?
{
if let x = optional {
return f(x)
}
else {
return nil
}
}
而且還指導我們定義一個可選的綁定功能。 注意:本書使用的是運算符>>=
,但我選擇使用命名函數,因爲它可以幫助我看到相似之處。
func optionalBind<T, U>(optional: T?, f: T -> U?) -> U?
{
if let x = optional {
return f(x)
}
else {
return nil
}
}
這兩種方法的實現看起來與我完全相同。兩者之間唯一的區別是它們採取函數參數:
map
需要該變換爲T成UoptionalBind
一個函數使用變換爲T插入可選ü
「嵌套」 這些函數調用的結果傷害了我的大腦:
func addOptionalsBind(optionalX: Int?, optionalY: Int?) -> Int?
{
return optionalBind(optionalX) { x in
optionalBind(optionalY) { y in
x + y
}
}
}
func addOptionalsMap(optionalX: Int?, optionalY: Int?) -> Int?
{
return map(optionalX) { x in
map(optionalY) { y in
x + y
}
}
}
addOptionalsBind
函數完全符合您期望的功能。- 的
addOptionalsMap
功能無法編譯,指出:'詮釋?'是不是可以轉換成'Int?'