如何向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
相关产品推荐
相关产品推荐

