我正在尝试使用泛型为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是什么类型。

10-07 16:41