作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有 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
?
最佳答案
我很喜欢 Martin 的解决方案很长一段时间,但最近遇到了麻烦。如果对象已经被 KVO 观察到,那么这将崩溃。 Self
在那种情况下是 KVO 子类,而 objectWithID
的结果不是那个子类,所以你会遇到类似“无法转换类型 'myapp 的值.Thing' (0xdeadbeef) 到 'myapp.Thing' (0xfdfdfdfd)。”有两个自称为 myapp.Thing
的类,as!
使用实际的类对象。所以 Swift 并没有被 KVO 类的高贵谎言所愚弄。
解决方案是将 Self
移到上下文中,用静态类型参数替换它:
extension NSManagedObjectContext {
func transferredObject<T: NSManagedObject>(object: T) -> T {
return objectWithID(object.objectID) as! T
}
}
T
纯粹是在编译时定义的,所以即使 object
是 T
的子类,这仍然有效。
关于swift - 如何使用泛型类型获取相同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233302/
我是一名优秀的程序员,十分优秀!