有没有办法将参数为子类的函数分配给参数为父类(super class)的函数变量?这是我的意思的一个例子:
class ClassA {}
class subclassOfA:ClassA {}
func subclassToNil(argument:subclassOfA) -> (){}
var functionVariable:(ClassA->())
funcVar = subclassToNil
这会引发类型不兼容异常。
最佳答案
恐怕不是——您已经发现了“协变”和“逆变”。函数类型与其参数(arguments)是逆变的,这意味着您可以根据需要提供父类(super class),但不能提供子类。另一方面,对于返回值,函数类型是协变的,如果您愿意,可以返回一个子类。
稍微想一想,这些规则是有道理的:
class ClassA {}
class SubclassOfA: ClassA {}
func subclassToNil(argument: SubclassOfA) -> ()) {}
var functionVariable: (ClassA -> ())
functionVariable = subclassToNil
functionVariable(ClassA()) //`subclassToNil` won't know what to do with this; kablooie!
但是:
class ClassParent {}
class ClassA: ClassParent {}
func subclassToNil(argument: ClassParent) -> ()) {}
var functionVariable:(ClassA -> ())
functionVariable = subclassToNil
functionVariable(ClassA()) //`ClassA()` is indeed a valid `ClassParent`, so we're fine.
因此使用不太具体的参数是安全的。返回值的推理非常相似,您会发现从逻辑上讲,您可以使用更具体的返回值。
关于函数类型中的快速子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35671622/