我正在尝试构建一个通用的记忆函数
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
为什么?
您的闭包语法不正确。签名部分进入{ }
的内部(参见闭包表达式语法(:
let foo = memoize(
{ (x: Foo) -> String in
print("miss")
return x.a
}
)
您还可以省略()
(称为尾随闭包(,它更惯用:
let foo = memoize {
(x: Foo) -> String in
print("miss")
return x.a
}