在Swift中,不能继承泛型:class Foo <t>:T {}

时间:2017-09-12 14:33:40

标签: ios generics swift3

我有一个类A,它是UICollectionViewController的子类。另一个班级B是UIViewController的子类; B包含UICollectionView。 A和B之间有足够的通用逻辑,我想将逻辑分解为一个公共扩展。我的想法是,我将使用相关扩展创建一个通用的Foo<T>,然后按如下方式对A和B进行编码:

class A : Foo<UICollectionViewController>

class B: Foo<UIViewController>

Foo<T>这样的事情:

class Foo<T> : T { ... }

这失败了,因为通用参数T显然是正确的 不能被称为超类。

为了解决这个问题,我尝试了一个带有协议和协议扩展的解决方案,但这种方法不起作用:@objc函数(例如,UICollectionViewDataSource的处理程序)无法在协议扩展中定义

将A和B“规范化”成为同一类型的控制器似乎有些过分。我要添加到A和B的常见“扩展程序”是UICollectionViewDataSourceUICollectionViewDelegateUIImagePickerControllerDelegate的处理程序。

有没有办法用泛型启用这种扩展逻辑?

1 个答案:

答案 0 :(得分:3)

  

A和B之间有足够的共同逻辑,我想将逻辑分解为公共扩展

我不知道通用在这里会如何帮助你;这似乎是对通用产品的误解。

您的目标似乎是注入相同的实施例,例如:您的UICollectionViewDataSource方法自动进入多个视图控制器类。基本上没办法这样做。

您的视图控制器类当然可以有一个调用通用功能的UICollectionViewDataSource方法,您可以通过协议扩展或任何其他方式注入;但是你的类仍然必须实现每个UICollectionViewDataSource方法明确地和单独地

那是因为这是Objective-C唯一能够查看实现的方式,并以集合视图功能运行所需的自动方式调用它。

请记住,Cocoa是用Objective-C编写的。它对协议扩展和泛型等Swift功能一无所知,也看不到它们。