NSManagedObject 子类中的泛型类型

Posted

技术标签:

【中文标题】NSManagedObject 子类中的泛型类型【英文标题】:Generic Types in NSManagedObject subclass 【发布时间】:2017-09-01 21:05:05 【问题描述】:

我正在学习 CoreData,我有一个相当基本的问题。

当我创建一个 NSManagedObject 子类时,在某些地方生成的代码会竭尽全力为我创建类型良好的函数,但在其他情况下会留下令人讨厌的通用性,我很困惑为什么。

例如,我有一对具有父/子、一对多(有序)关系的托管类。 ClassA 是可以容纳多个 ClassB 实例的父级。

在为 ClassA 生成的托管代码中,它为 ClassB 项目提供了容器:

@NSManaged public var items: NSOrderedSet?

这是通用的,但是在代码的后面有很多方便类型的函数,比如这个:

@objc(insertObject:inItemsAtIndex:)
@NSManaged public func insertIntoItems(_ value: ClassB, at idx: Int)

很好...但是缺少一个基本的:获取项目集合的强类型访问器。

我当然可以轻松地投射东西:

var myItem = myObjectOfClassA.items[0] as! ClassB

但我很困惑......为什么他们在很多情况下都竭尽全力制作类型良好的函数,却留下最基本的东西之一通用?

我假设这里有一些我不明白的基本内容。

【问题讨论】:

【参考方案1】:

因为 Swift 和 Foundation,这就是原因。

这种关系目前可能是通用的。它不是更通用的,因为

NSOrderedSet 不是通用的,因此您不能拥有 NSOrderedSet<ClassB>,例如。 虽然 Swift 包括像 ArraySet 这样的泛型集合,但没有 Swift-y 泛型 OrderedSet 集合。

Core Data 代码生成中也存在与 Swift 相关的空白。例如,如果此关系未排序,则生成的代码仍将使用非泛型 NSSet。没有充分的理由,但至少可以将其转换为 Set

【讨论】:

以上是关于NSManagedObject 子类中的泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

泛型深入--java泛型的继承和实现泛型擦除

Java 中的泛型

Java中的泛型的问题?

Java语言中的泛型

Java中的泛型

TS中的泛型