无法推断通用参数"Arg" - 通用记忆函数

  • 本文关键字:记忆 函数 Arg 参数 swift
  • 更新时间 :
  • 英文 :


我正在尝试构建一个通用的记忆函数

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
}

最新更新