ios - 在 Swift 中,不能子类泛型 : class Foo<T> : T {}

标签 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显然 不能作为父类(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/

相关文章:

iOS 快速获取用户家乡最新FBSDK

ios - 从应用商店安装应用时是否可以调用api

iOS swift NumberFormatter 小数样式本地化

Java 自定义通用列表 : add() method error

ios - XCUIApplication 仅适用于 iOS 9.0 或更新版本,swift3

ios - 添加分析事件以记录项目中每个 ViewController 的名称

java - 通用对象的集合。自动类型转换?隐藏类型转换?

java - 如何在 Java 泛型方法中正确返回泛型数组?

ios - 如何在 Objective c xib 类中导航 View Controller (用 swift 制作)

ios - 使用 ios swift 3 在 linkedin 上分享帖子,而 linkedin sdk 无法正常工作