Можно ли наследовать класс в зависимости от версии iOS?
Базовый класс устанавливается при компиляции кода, а не во время выполнения, поэтому вы не можете переключать базовые классы в зависимости от версии ОС, на которой работает ваш код.
Мне необходимо, чтобы для версии iOS <11.0 использовался класс со сторонним фреймворком, но в версии iOS> = 11.0 использовалось стандартное решение.
Способ сделать это состоит в том, чтобы использовать сдерживание вместо наследования, чтобы вы могли настроить свой объект с желаемым поведением при выполнении кода. Думайте об этом как о делегировании, где у вас есть вспомогательный объект, который позволяет вам специализировать класс без создания подкласса.
Например, предположим, у вас есть класс BaseTableViewCell
, определенный на основе UITableViewCell
, как вы показали:
// Available for iOS >= 11.0
class BaseTableViewCell: UITableViewCell {
}
Но, возможно, версии iOS более ранние, чем 11.0, не имеют какой-либо функциональности, которую вы хотите связать со смахиванием, поэтому вы сначала создаете протокол, который объявляет функции, которые обеспечивают поведение, которое вам нужно добавить:
protocol SwipingProtocol {
func swipe()
}
... и создавать классы, которые реализуют функцию (и) в этом протоколе
class OldSwiper : SwipingProtocol {
func swipe() { // put your < 11.0 swiping code here }
}
class NewSwiper : SwipingProtocol {
func swipe() { // put your >= 11.0 swiping code here }
}
... и, наконец, добавьте поддержку этого в ваш базовый класс:
class BaseTableViewCell: UITableViewCell {
var swiper : SwipingProtocol
init() {
if systemVersion < 11.0 {
swiper = OldSwiper()
}
else {
swiper = NewSwiper()
}
}
func swipe() {
swiper.swipe()
}
}
Итак, теперь у вас есть две (или, возможно, больше) реализации поведения смахивания, содержащиеся в OldSwiper
и NewSwiper
, и ваш базовый класс решает, какой из них использовать в зависимости от среды, в которой он работает.
Можно, конечно, пропустить весь протокол и встроить как старое, так и новое поведение в BaseTableViewCell
, переключаясь между ними с помощью операторов if
в каждом методе, где есть зависящие от ОС настройки. Однако использование протокола и вспомогательного класса приятнее, поскольку он хранит все специфичные для версии вещи, содержащиеся в отдельных классах. Это также делает ваш код гибким - если вы хотите в будущем сделать что-то другое для iOS 14.0 и выше, внесение этого изменения - просто вопрос создания новой реализации SwipingProtocol
.