You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:45:00