我有一个类 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
显然
不能作为父类(super class)引用。
为了解决这个问题,我尝试了使用协议(protocol)和协议(protocol)扩展的解决方案,但该方法不起作用:@objc
函数(例如,UICollectionViewDataSource
的处理程序)无法在协议(protocol)扩展中定义。
将 A 和 B“规范化”为同一类型的 Controller 似乎有点过分了。我想添加到 A 和 B 的常见“扩展”是 UICollectionViewDataSource
的处理程序, UICollectionViewDelegate
, UIImagePickerControllerDelegate
.
有没有办法用泛型启用这种扩展逻辑?
最佳答案
There is enough common logic between A and B that I would like to factor out the logic into a common extension
我看不出泛型在这里对您有何帮助;这似乎是对泛型的误解。
看来您的目标是注入(inject)相同的实现,例如您的 UICollectionViewDataSource 方法自动转换为多个 View Controller 类。基本上没有办法做到这一点。
你的 View Controller 类当然可以有一个 UICollectionViewDataSource 方法,它调用通用功能,你可以通过协议(protocol)扩展或其他方式注入(inject);但是您的类仍然必须实现每个 UICollectionViewDataSource 方法明确且单独。
那是因为这是 Objective-C 永远查看实现并以 Collection View 功能运行所需的自动方式调用它的唯一方式。
请记住,Cocoa 是用 Objective-C 编写的。它对协议(protocol)扩展和泛型等 Swift 功能一无所知,也看不到它们。
关于ios - 在 Swift 中,不能子类泛型 : class Foo<T> : T {},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179193/