更新:有关更好的解决方案,请参阅Rob 的回答。
与如何在 NSManagedObject Swift 扩展中创建托管对象子类的实例类似?,这可以通过一个通用的辅助方法来完成:
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()
更新: Jean-Philippe Pellet 建议
定义一个全局可重用函数而不是辅助方法来将返回值转换为适当的类型。
我建议定义两个(重载)版本,以使其适用于可选和非可选对象(没有不需要的自动包装到可选对象中):
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 版本的代码可以在编辑历史中找到。)