2017-06-01 104 views
1

我想知道是否有可能允许方法接受泛型超类的任何子类。我已经发布了下面我想要实现的示例代码。希望能够更好地描述我的情况。Swift泛型 - 允许作为参数传递的子类

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的对象,以便通过此方法处理。这可能吗?是否有更好的设置,我应该用来实现这一目标?

谢谢。

回答

0

test通用:

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

感谢这个信息,我现在好奇我们如何能做类似的事情,但对于一个将返回类似项目的方法。 我正在尝试一些方法,但尚未找出正确的方法来完成这项工作。 'FUNC返回类型() - >ü。键入{ 返回SubClass.self }' – Steve

+0

这不会因为'T'工作和'U'可以是任何类型的满足约束。你想要做什么?另外,我怀疑这应该是一个单独的问题。 @Steve – Sweeper

+0

我同意,这是一个单独的问题。基本上我希望通过解决上面的例子(你的答案确实解决了这个问题)能理解我是如何能够传递一个通用超类的多个子类版本的。我有多个tableviewcell,每个tableviewcell都继承了一个tableviewcell,它知道如何将数据放在自己的位置。每个子类的数据类型都不相同。这非常精细,我可能不会很好地解释它。为了解决这个问题,我们将继续挖掘并尝试新问题。谢谢。 – Steve

0

父类< SuperDataClass>不是一个超类父类< SubDataClass>,它是使用相同的通用的,但不一样的关联类型不同的类。

泛型的关联类型是其他类的子类的事实并不隐含地将泛型类作为其祖先。

例如,如果你要重写父类< SubDataClass的方法>(或亚类),你将被重写父类< T>,不超< SuperDataClass>。

在通用的声明中< T:SuperDataClass>是使用SuperClass的约束,而不是层次关系。

相关问题