gpt4 book ai didi

swift - 如何使用泛型类型获取相同类型的对象

转载 作者:搜寻专家 更新时间:2023-10-30 22:10:46 39 4
gpt4 key购买 nike

我有 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 纯粹是在编译时定义的,所以即使 objectT 的子类,这仍然有效。

关于swift - 如何使用泛型类型获取相同类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233302/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com