Swift泛型记忆化函数如何将Fn参数设置为泛型类型
你尝试的第一种写法无法通过Swift编译,核心原因是Swift不支持将函数类型作为泛型约束的边界。泛型约束中:右侧只能填写协议、类类型,而(Arg) -> Ret是具体的函数值类型,不能放在约束位声明泛型Fn。
你提到的第二种写法可读性差的问题,可以通过typealias给通用函数类型定义别名优化:
// 先定义单参数函数的通用别名 typealias Transform<Input: Hashable, Output> = (Input) -> Output func memoize<Arg: Hashable, Ret>(_ fn: @escaping Transform<Arg, Ret>) -> Transform<Arg, Ret> { var cache: [Arg: Ret] = [:] return { x in // 注意:你原有写法中的cache[x, default: fn(x)]存在隐藏问题 // default参数会提前求值,即使缓存存在也会执行fn(x),失去记忆化意义 if let cached = cache[x] { return cached } let result = fn(x) cache[x] = result return result } }
额外补充:如果你需要支持自定义的可调用类型(比如符合@dynamicCallable的自定义结构体),可以额外添加泛型约束,但返回值依然无法直接声明为原输入的Fn类型——因为你返回的是系统自动生成的闭包实例,和输入的Fn是完全不同的类型,强行声明返回Fn会触发类型不匹配的编译错误。
内容的提问来源于stack exchange,提问作者david_adler
相关产品推荐
相关产品推荐

