[英]In Swift, cannot subclass generic: class Foo<T> : T {}
我有一个类A,它是从UICollectionViewController
子类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”“标准化”为相同类型的控制器似乎有些矫kill过正。 我要添加到A和B的常见“扩展名”是UICollectionViewDataSource
, UICollectionViewDelegate
, UIImagePickerControllerDelegate
处理程序。
有没有办法用泛型启用这种扩展逻辑?
A和B之间有足够的通用逻辑,我想将其分解为通用扩展
我看不到仿制药将如何在这里为您提供帮助; 这似乎是对泛型的误解。
看来您的目标是,例如,将UICollectionViewDataSource方法的相同实现自动注入到多个视图控制器类中。 基本上没有办法做到这一点。
您的视图控制器类当然可以具有一个UICollectionViewDataSource方法,该方法调用通用功能,您可以通过协议扩展或其他方式注入该功能。 但是您的类仍必须显式且单独地 实现每个UICollectionViewDataSource方法。
这是因为,这是Objective-C唯一会看到实现并以需要集合视图功能运行的自动方式对其进行调用的方法。
记住,可可是用Objective-C编写的。 它对协议扩展和泛型等Swift功能一无所知,也看不到它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.