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

如何向Swift函数传递遵循NSObject与NSCoding的类并修正语法错误

正确实现方式

你需要通过泛型函数来实现类型约束,因为Swift不支持直接给AnyClass添加NSObject和NSCoding的组合约束。以下是修正后的代码:

func retrieveRepository<T: NSObject & NSCoding>(componentName: String, ofClass: T.Type) -> T? {
    let fileUrl = getDocumentsDirectory().appendingPathComponent(componentName)
    do {
        let rawData = try Data(contentsOf: fileUrl)
        // 直接返回符合约束的类型实例,无需转为Any?
        return try NSKeyedUnarchiver.unarchivedObject(ofClass: ofClass, from: rawData)
    } catch {
        // 可按需打印错误信息辅助调试
        // print("解归档失败:\(error)")
        return nil
    }
}

关键修正点

  • 使用泛型T并添加约束T: NSObject & NSCoding,明确限定传入的类必须同时继承NSObject且遵循NSCoding协议,完全匹配NSKeyedUnarchiver.unarchivedObject的参数要求。
  • 返回值从Any?改为T?,类型更安全,调用时无需额外强制类型转换。
  • 移除了原代码中错误的AnyClass<NSObject, NSCoding>写法,这是Swift语法不支持的写法。

使用示例

// 假设你有一个遵循NSCoding的自定义类
class CustomModel: NSObject, NSCoding {
    // 实现NSCoding相关方法...
    func encode(with coder: NSCoder) {
        // 编码逻辑
    }
    
    required init?(coder: NSCoder) {
        // 解码逻辑
        super.init()
    }
}

// 调用函数时指定类型
if let model = retrieveRepository(componentName: "customModel", ofClass: CustomModel.self) {
    // 使用model
}

内容的提问来源于stack exchange,提问作者Fabrizio Bartolomucci

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 19:30:55