我有一个类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的常见“扩展程序”是UICollectionViewDataSource
,UICollectionViewDelegate
,UIImagePickerControllerDelegate
的处理程序。
有没有办法用泛型启用这种扩展逻辑?
答案 0 :(得分:3)
A和B之间有足够的共同逻辑,我想将逻辑分解为公共扩展
我不知道通用在这里会如何帮助你;这似乎是对通用产品的误解。
您的目标似乎是注入相同的实施例,例如:您的UICollectionViewDataSource方法自动进入多个视图控制器类。基本上没办法这样做。
您的视图控制器类当然可以有一个调用通用功能的UICollectionViewDataSource方法,您可以通过协议扩展或任何其他方式注入;但是你的类仍然必须实现每个UICollectionViewDataSource方法明确地和单独地。
那是因为这是Objective-C唯一能够查看实现的方式,并以集合视图功能运行所需的自动方式调用它。
请记住,Cocoa是用Objective-C编写的。它对协议扩展和泛型等Swift功能一无所知,也看不到它们。