函数类型中的快速子类

标签 swift function types

有没有办法将参数为子类的函数分配给参数为父类(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/

相关文章:

ios - 如何将水平分页捕捉到像 App Store 这样的多行 Collection View ?

Javascript:使用不同的执行上下文执行函数

c++ - 函数是否在退出作用域时清除动态内存?

c - _t(下划线-t)后面的类型代表什么?

ios - 无法为 iphone 4s、5、5s、6、6s 设置纵向和横向模式的启动图像

ios - 我该如何解决 Could not cast value of type 'UINavigationController'

c++ - 在 c++(11) 中是否有更简洁的方法来复制具有多类型值的 unordered_map

java - 具有不同数据类型的数组,即字符串和整数。 (面向对象)

ios - 如何以编程方式更改将在加载时显示的 swift 文件?

function - Vala中的 "_"函数有什么作用?