一尘不染

如何使用泛型类型获取具有相同类型的对象

swift

NSManagedObject对此进行了扩展,应该可以帮助我在上下文之间传输对象:

extension NSManagedObject {

    func transferTo(#context: NSManagedObjectContext) -> NSManagedObject? {

        return context.objectWithID(objectID)
    }

}

现在它返回的对象,NSManagedObject我应该将其强制转换为我想要的类,如下所示:

let someEntity: MyEntity = // ...create someEntity
let entity: MyEntity = someEntity.transferTo(context: newContext) as? MyEntity

有没有办法Swift避免这种无用的转换,如果我transferTo(context: ...)从类的对象调用MyEntity使其返回类型MyEntity


阅读 266

收藏
2020-07-07

共1个答案

一尘不染

更新: 有关更好的解决方案


与如何在NSManagedObjectSwift扩展中如何创建托管对象子类的实例中类似,这可以使用通用的辅助方法来完成:

extension NSManagedObject {

    func transferTo(context context: NSManagedObjectContext) -> Self {
        return transferToHelper(context: context)
    }

    private func transferToHelper<T>(context context: NSManagedObjectContext) -> T {
        return context.objectWithID(objectID) as! T
    }
}

请注意,我已将返回类型更改为SelfobjectWithID()没有
返回一个可选的(对比objectRegisteredForID(),因此没有必要在这里返回一个可选的。

更新: Jean-Philippe Pellet建议
定义一个全局可重用函数,而不是将返回值转换为适当类型的helper方法。

我建议定义两个(重载)版本,以使其与可选对象和非可选对象一起工作(不要在不需要的情况下自动包装到可选对象中):

func objcast<T>(obj: AnyObject) -> T {
    return obj as! T
}

func objcast<T>(obj: AnyObject?) -> T? {
    return obj as! T?
}

extension NSManagedObject {

    func transferTo(context context: NSManagedObjectContext) -> Self {
        let result = context.objectWithID(objectID) // NSManagedObject
        return objcast(result) // Self
    }

    func transferUsingRegisteredID(context context: NSManagedObjectContext) -> Self? {
        let result = context.objectRegisteredForID(objectID) // NSManagedObject?
        return objcast(result) // Self?
    }
}

(我已经更新了Swift 2 / Xcode 7的代码。可以在编辑历史记录中找到Swift早期版本的代码。)

2020-07-07