Ios 属于Y的子类的X型下行集
注意:尽管问题有一个Ios 属于Y的子类的X型下行集,ios,swift,downcast,Ios,Swift,Downcast,注意:尽管问题有一个CoreData示例,但它与CoreData无关,它只是一个示例 我们正在进行一个Swift项目,将CoreData作为缓存层 在我们的NSManagedObjectContext有新的更改后,我们在mainViewController中大量使用通知s来听取更改 在我们添加具有以下层次结构的新实体之前,这一切都非常有效: 实体Vehicle是具有某些属性的基类 实体Car是Vehicle的一个子类,具有特定的属性和与人实体的许多关系 实体Human是具有特定属性的基类,它与
CoreData
示例,但它与CoreData
无关,它只是一个示例
我们正在进行一个Swift项目,将CoreData
作为缓存层
在我们的NSManagedObjectContext
有新的更改后,我们在mainViewController
中大量使用通知
s来听取更改
在我们添加具有以下层次结构的新实体之前,这一切都非常有效:
- 实体
是具有某些属性的基类李>Vehicle
- 实体
是Car
的一个子类,具有特定的属性和与Vehicle
人
实体的许多关系李>
- 实体
是具有特定属性的基类,它与Human
有关系Car
- 实体
添加新的
Car
对象时,会触发通知,在mainViewController
中,我们需要检查它是否属于Car
类型,如下所示:
if let insertedObjects = notification.userInfo?[NSInsertedObjectsKey] as? Set<Car> {
print("we have some cars") // this will never execute
}
如果您有任何问题,请告诉我,而不是直接投反对票。不确定类型转换(我记得我用相同的方法进行了转换,虽然使用了数组),但检查集合中是否有汽车是不同的:
set.contains { (element) -> Bool in
return element is Car
}
或同一通话的更短(更简洁)版本:
set.contains(where: { $0 is Car })
首先将插入的对象向下投射到
集
。
要检查是否已插入任何车辆,请使用
if let insertedObjects = notification.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject> {
if insertedObjects.contains(where: { $0 is Car }) {
print("we have some cars")
}
}
你的方法
if insertedObjects.contains(Car)
不编译,因为
func contains(_ member: Set.Element) -> Bool
需要元素类型的实例作为参数。
如上所示,您可以使用基于谓词的变量
func contains(where predicate: (Element) throws -> Bool) rethrows -> Bool
相反
func contains(_ member: Set.Element) -> Bool
func contains(where predicate: (Element) throws -> Bool) rethrows -> Bool