【问题标题】:swift subclasses in function types函数类型中的 swift 子类
【发布时间】:2016-06-10 20:14:40
【问题描述】:

有没有一种方法可以将带有子类参数的函数分配给带有超类参数的函数变量?这是我的意思的一个例子:

class ClassA {}

class subclassOfA:ClassA {}

func subclassToNil(argument:subclassOfA) -> (){}

var functionVariable:(ClassA->())

funcVar = subclassToNil

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

【问题讨论】:

  • 那行不通。可以使用ClassA 的实例调用functionVariable(),但该函数需要一个子类 的实例作为参数。 (反之亦然。)

标签: swift function types


【解决方案1】:

恐怕没有——您已经发现了“协变”和“逆变”。函数类型与它们的参数(参数)是逆变的,这意味着你可以提供一个 superclass 如果你愿意,但不能提供一个子类。另一方面,使用返回值,函数类型是协变的,如果你愿意,可以返回一个子类

稍加思考,这些规则是有道理的:

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.

所以使用 less 特定的参数是安全的。返回值的原因非常相似,您会发现从逻辑上讲,您可以使用更多特定的。

【讨论】:

  • 这很有趣,因为我尝试了一个返回类型作为子类的示例,正​​如你所说,编译器没有抱怨。这个例子很清楚为什么设置 'subclassToNil' 不会改变 functionVariable 的类型签名!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多