函数类型中的 swift 子类



有没有办法将参数为子类的函数分配给具有超类参数的函数变量?以下是我的意思的一个例子:

class ClassA {}
class subclassOfA:ClassA {}
func subclassToNil(argument:subclassOfA) -> (){}
var functionVariable:(ClassA->())
funcVar = subclassToNil

这将引发类型不兼容异常。

恐怕不是——你已经发现了"协方差"和"逆变"。函数类型与其参数(参数)是逆变的,这意味着如果需要,您可以提供一个超类,但不能提供子。另一方面,对于返回,函数类型是协变的,如果您愿意,可以返回子类

稍加思考,这些规则是有意义的:

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.

因此,使用不太具体的参数是安全的。返回值的推理非常相似,从逻辑上讲,您可以使用具体的值。

最新更新