Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 属于Y的子类的X型下行集_Ios_Swift_Downcast - Fatal编程技术网

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