Swift Generics - 允许子类作为参数传递

时间:2017-06-01 19:33:11

标签: swift generics

我想知道是否可以允许方法接受泛型超类的任何子类。我已经发布了我在下面尝试实现的示例代码。希望这能更好地描述我的情况。

import UIKit

class SuperDataClass {

}

class SubDataClass: SuperDataClass {

}

class SuperClass<T: SuperDataClass>: UITableViewCell {

}

class SubClass: SuperClass<SubDataClass> {

}

class Example {
    func test(object: SuperClass<SuperDataClass>) {
        print(object)
    }
}

let object = SubClass()
Example().test(object: object)

在游乐场中运行时,您会收到以下错误:

Playground execution failed: error: Generics.playground:20:24: error: cannot convert value of type 'SubClass' to expected argument type 'SuperClass<SuperDataClass>'

据我所知,原因是数据类型是该方法所期望的数据类型的子类。

将第15行更改为

class SubClass: SuperClass<SuperDataClass> {

将解决问题,但不适用于我想要实现的方案。我喜欢处理任何子类化SuperClass的对象的方法,这个对象由这个方法处理。这可能吗?我是否应该使用更好的设置来实现这一目标?

谢谢。

2 个答案:

答案 0 :(得分:1)

test通用:

class Example {
    func test<T>(object: SuperClass<T>) {
        print(object)
    }
}

答案 1 :(得分:0)

SuperClass&lt; SuperDataClass&gt;不是SuperClass的超类&lt; SubDataClass&gt ;,它是使用相同通用但不是相同关联类型的不同类。

泛型相关类型是另一个类的子类这一事实并不会隐式地使泛型类成为它的祖先。

例如,如果要覆盖SuperClass中的方法&lt; SubDataClass&gt; (或SubClass),你将覆盖SuperClass&lt; T>,而不是SuperClass&lt; SuperDataClass&gt;。

在通用声明中&lt; T:SuperDataClass&gt;是使用SuperClass的约束,而不是层次关系。