我正在嘗試構建一個通用的記憶功能
func memoize<Arg: Hashable, Ret>(_ fn: @escaping ((Arg) -> Ret)) -> ((Arg) -> Ret) {
var cache: [Arg:Ret] = [:]
func inner (x: Arg) -> Ret {
let ret = cache[x, default: fn(x)]
cache[x] = ret
return ret
}
return inner
}
但是由于某種原因我無法將我的函式定義為閉包
struct Foo: Hashable {
let a: String
let b: String
}
let foo = memoize(
(x: Foo) -> String in {
print("miss")
return x.a
}
)
Cannot convert value of type '((Foo) -> String).Type' to expected argument type '(Arg) -> Ret'
Generic parameter 'Arg' could not be inferred
這是為什么?
uj5u.com熱心網友回復:
您的閉包語法不正確。簽名部分進入里面的的{ }(見封運算式語法):
let foo = memoize(
{ (x: Foo) -> String in
print("miss")
return x.a
}
)
您還可以省略()(稱為尾隨閉包),這更慣用:
let foo = memoize {
(x: Foo) -> String in
print("miss")
return x.a
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/368976.html
標籤:迅速
