如何根据API级别从Swift中的两个不同类派生一个类?

时间:2017-07-06 13:54:30

标签: swift inheritance swift3

我想使用带有SwipeTableViewCell类的库(从UITableViewCell派生),但它只支持iOS 9,所以我希望尽可能从该类派生,但是如果应用程序在9.0以下运行,则从普通的UITableViewCell类派生

这是我能想到的最好的(不工作):

@available(iOS, obsoleted: 9.0)
class MyTableViewCell : UITableViewCell {
}

@available(iOS 9.0, *)
class MyTableViewCell : SwipeTableViewCell {
}

然后我尝试从该课程派生出来:

class SomeOtherTableViewCell : MyTableViewCell {
}

Xcode给出了以下错误并链接到上面的两个类定义:

SomeOtherTableViewCell.swift:34:31: 'MyTableViewCell' is ambiguous for type lookup in this context
Found this candidate
Found this candidate

根据API级别,Swift有条件地从两个不同的类派生出来的很酷的方式是什么?

1 个答案:

答案 0 :(得分:2)

不幸的是(或者幸运的是取决于你如何看待它),从语言的角度来看,使用Swift或Objective-C无法实现你正在尝试做的事情。您正在使用的@available属性是告诉编译器,只有当您编译的目标的deployment target大于您指定的目标时,此类才可用。

@MartinR提到了#available以及您应该用来实现目标的一般模式。

这两件事可用且支持向后兼容性的原因是因为编译代码不一定具有关于运行时的所有信息。编译器/链接器在编译时使用SDK的头和模块映射检查API,类等是否存在。但是,您的应用程序在运行时动态地与系统框架链接。这种模式就是为什么您的应用程序不必与其使用的SDK的每个部分的副本一起分发的原因。

在您的情况下,您有SDK9并且正在尝试支持iOS 8或更低版本的运行时。 SwipeTableViewCell在iOS 8中不起作用可能是因为它使用仅在iOS 9中可用的API。所有这些都不会阻止{8}在iOS 8设备上存在,它只是阻止它工作。

你真的应该评估whether you need to support iOS 8。如果您将目标部署目标更改为iOS 9并将其发布到App Store,则运行iOS 8的用户将无法获得更新或无法安装。

更新

在做了一些思考和一些研究后,我想出了一个可能的解决方案。我只是在依赖于UI的故事板的环境中测试它,但我认为它可以优雅地桥接你的iOS目标。

SwipeTableViewCell