Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
Swift 将类强制转换为子类失败_Swift_Parse Platform - Fatal编程技术网

Swift 将类强制转换为子类失败

Swift 将类强制转换为子类失败,swift,parse-platform,Swift,Parse Platform,编辑-抱歉,伙计们,我认为我没有提供足够的细节: 在Parse的iOS框架中,它们是一个名为PFObject(ClassA)的类。该框架还允许您子类化(ClassB)PFObject。而且,如果出现我给出的场景,它们将是无问题 我的问题是这怎么可能?我理解子类可能包含主类中不存在的变量/方法,从而使将类强制转换为子类的过程变得不合理/不安全 他们有一个定义为PFSubclassing的协议,但我不知道这是如何允许这种行为发生的 我在操场上有以下几点: class ClassA: NSObjec

编辑-抱歉,伙计们,我认为我没有提供足够的细节:

在Parse的iOS框架中,它们是一个名为PFObject(ClassA)的类。该框架还允许您子类化(ClassB)PFObject。而且,如果出现我给出的场景,它们将是问题

我的问题是这怎么可能?我理解子类可能包含主类中不存在的变量/方法,从而使将类强制转换为子类的过程变得不合理/不安全

他们有一个定义为PFSubclassing的协议,但我不知道这是如何允许这种行为发生的


我在操场上有以下几点:

class ClassA: NSObject { }
class ClassB: ClassA { }

let objectA = ClassA()
let objectB = objectA as! ClassB // <- Crashes
类ClassA:NSObject{}
类别B:类别A{}
设objectA=ClassA()

让objectB=objectA为!ClassB/您知道继承是如何正确工作的吗?类B继承自类A。当您创建类A的实例,然后尝试将其转换为类B时,可能会发生许多不同的情况,因为这是未定义的行为。这里的问题是所谓的切片。编译器拒绝从父类向下转换为子类,因为它知道子类可能具有不同的信息(变量、func.等),并且不一定知道如何将这些信息转换为超级类子类的实例。然而,反过来几乎总是好的,即

let objectB = ClassB()
let objectA = objectB as? ClassA

子类从其超类继承所有功能,并可以添加自己的功能


从逻辑上讲,您只能从多功能转换为少功能(sub->super),但不能从多功能转换为少功能。

谢谢您的回答。Parse的iOSSDK不知何故允许这种行为,我试图理解他们是如何做到的。他们有一个类PFObject(class a),并允许您从中创建任意类(比如class B)。然后允许您将PFObject的对象强制转换为所述任意类!可能涉及到方法swizzling?您的意思是如果让castedClass=classB as,则类似于
?PFObject?
?谢谢您的回答。Parse的iOSSDK不知何故允许这种行为,我试图理解他们是如何做到的。他们有一个类PFObject(class a),并允许您从中创建任意类(比如class B)。然后允许您将PFObject的对象强制转换为所述任意类!可能涉及到方法切换?在幕后必须有额外的逻辑(和特定的要求)来处理这个问题。