swift - 如何使用父类(super class)中声明的方法返回子类的实例?

标签 swift generics

<分区>

在 objc 中,我创建了用于创建对象的 NSManagedObject 扩展。现在所有的子类都可以使用它来创建自己类型的对象。我已经在 swift 中尝试了类似的东西,但完全符合我的意愿,通过使用泛型。

extension NSManagedObject {

    // MARK: - Creation Methods

    class func create<T: NSManagedObject>(in context: NSManagedObjectContext) -> T {
        let entity = NSEntityDescription.entity(forEntityName: T.description(), in: context)!
        return T(entity: entity, insertInto: context)
    }
}

NSManagedObject 的子类 Person 类中,我可以这样调用它:

let person = Person.create(context)

person 将是 NSManagedObject 类型,我必须将其转换为 Person,才能访问姓名、电话等属性...

我想以某种方式避免这种情况,并使方法 create 返回各种类型的 instancetype,但我不确定该怎么做?

最佳答案

而不是 NSManagedObject 的扩展,我更喜欢协议(protocol)扩展

protocol Managed
{
    associatedtype ManagedType: NSManagedObject = Self
    static var entityName : String { get }
    static func create(in context: NSManagedObjectContext) -> ManagedType
}

extension Managed where Self : NSManagedObject
{
    static var entityName : String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

    static func create(in context: NSManagedObjectContext) -> ManagedType
    {
        return NSEntityDescription.insertNewObject(forEntityName: entityName, into: context) as! ManagedType
    }
}

让所有的NSManagedObject子类都采用协议(protocol)Managed

关于swift - 如何使用父类(super class)中声明的方法返回子类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634296/

相关文章:

ios - 在 Swift 中将 HTML 转换为纯文本

ios - 如果元素符合给定协议(protocol),则扩展数组以符合协议(protocol)

swift - 将类型从类型数组传递到泛型方法

.net - 单元测试可查询

java - Java中删除集合方法的通用类型

ios - 我试图在滚动页面时更改 ImageView 高度

swift - Parse 中的数据未加载到 PFQueryTableViewController 中

ios - 室内定位和 iBeacons

java - 使用泛型参数实例化泛型类时出错

java - 为什么不能扩展集合泛型类型