我NSManagedObject对此进行了扩展,应该可以帮助我在上下文之间传输对象:
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?
Swift
transferTo(context: ...)
MyEntity
更新: 有关更好的解决方案
与如何在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 } }
请注意,我已将返回类型更改为Self。 objectWithID()并 没有 返回一个可选的(对比objectRegisteredForID(),因此没有必要在这里返回一个可选的。
Self
objectWithID()
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早期版本的代码。)