我正在尝试使用泛型为NSManagedObject的子类提供通用方法,但是当Swift似乎无法找到泛型/将泛型转换为具体类时,我遇到了错误:
/// NSManagedObject+Helper.swift
///
import Foundation
extension NSManagedObject {
public static func inserta<T>() -> T? {
let name = self.entityName()
return CoreDataManager.createRow(inEntityNamed: name) as? T
}
}
/// MySwitch+CoreDataClass.swift
///
import Foundation
import CoreData
@objc(MySwitch)
public class MySwitch: NSManagedObject {
}
1 extension MySwitch {
2
3 @NSManaged public var key: String?
4 @NSManaged public var sValue: String?
5 @NSManaged public var value: String?
6
7 public class func insert(withKey key: String, value: String, sValue: String? = nil) throws -> MySwitch {
8 if let row = self.inserta() as? MySwitch {
9 row.key = key
10 row.value = value
11 if let sValue = sValue {
12 row.sValue = sValue
13 }
14 return row
15 }
16 throw CoreDataError.create_row
17 }
18 }
因此,在第8行中调用会给出错误“ MySwitch?”不能转换为“ MySwitch”。
通过删除转换,我得到了错误:无法推断通用参数“ T”
通过将第8行更改为
MySwitch.self.inserta() as? MySwitch
,它将显示相同的“ MySwitch?”。无法转换为“ MySwitch”错误。我想我没有告诉Swift关于
T
的含义,因为我也得到了警告:Cast from '_?' to unrelated type 'MySwitch' always fails
最佳答案
发现了泛型的问题。我首先需要将MySwitch的变量声明为可选变量:
1 let mySwitch: MySwitch? = inserta()
2 if let row = mySwitch {...
这样我就告诉Swift
T
是什么类型。