Наследовать класс в зависимости от версии iOS (swift) - PullRequest
3 голосов
/ 24 апреля 2019

Можно ли наследовать класс в зависимости от версии iOS?

У меня есть код:

let cell1 = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier1", for: indexPath) as! MyCell1
// ....
let cell2 = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier2", for: indexPath) as! MyCell2

Мне необходимо, чтобы для iOS использовалась версия <11.0класс со сторонним фреймворком, но в версии iOS> = 11.0 было использовано стандартное решение.

class MyCell1: BaseTableViewCell {
    // Different code
}

class MyCell2: BaseTableViewCell {
    // Different code
}

// Available for iOS >= 11.0
class BaseTableViewCell: UITableViewCell {
}

// Available for all other versions
class BaseTableViewCell: SwipeTableViewCell {
}

В стороннем фреймворке у меня есть этот класс:

class SwipeTableViewCell: UITableViewCell {
    // Different code
}

ВВещество, я хочу добавить межслойный класс для iOS <11.0 </p>

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Можно ли наследовать класс в зависимости от версии 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.

0 голосов
/ 24 апреля 2019

Это должно иметь то, что вам нужно: Проверить версию ОС в Swift?

var cell: BaseTableViewCell? = nil

if #available(iOS 11.0, *) {
    cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier1", for: indexPath)
} else {
    cell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifier2", for: indexPath)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...