Переопределить регистр перечисления в подклассе - PullRequest
0 голосов
/ 28 января 2020

У меня есть файл Swift, который объявляет перечисление, которое я использую в функциях класса, определенного в файле:

class EnumTableViewController: UITableViewController {
    enum SectionType {
        case undefined
    }

    public func sectionType(for sectionNumber: Int) -> SectionType {
        ...
    }
}

Я хочу выйти из этого класса и переопределить перечисления в потомок (каждому из моих потомков нужны разные функциональные возможности, поэтому значения перечислений должны быть уникальными), и при этом он может вызывать вспомогательные методы суперкласса.

class ExampleTableViewController: EnumTableViewController {
    enum SectionType {
        case undefined
        case first
        case second
        case third
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let sectionType = self.sectionType(for: section)

        ...
    }
}

В Objective- C I может просто переопределить перечисление, как я представлял выше, но, насколько я знаю, в Swift нет способа изменить или переопределить его. Очевидно, мне нужно какое-то другое решение, но я не знаю, что искать.

Для меня важны две вещи: 1. уметь использовать функции перечисления (такие как завершение табуляции и переключатели) и 2. иметь те же функции, которые принимают это перечисление в качестве параметров только в одном месте, не повторяя их в каждом классе.

1 Ответ

0 голосов
/ 29 января 2020

Кажется, что с помощью Sweeper решение выглядит примерно так:

protocol EnumTableViewController: UITableViewController {
    associatedtype SectionType
}

extension EnumTableViewController {
    func sectionType(for sectionNumber: Int) -> SectionType? {
        ...
    }
}

class ExampleTableViewController: UITableViewController, EnumTableViewController {
    typealias SectionType = ExampleSectionType

    enum ExampleSectionType {
       case first
       case second
       ...
    }
}

Так что в основном мне пришлось разделить функциональность EnumTableViewController на протокол (который лучше подходил) в любом случае) и расширение UITableViewController. Поскольку протокол не может ничего знать о реализации перечисления потомка, мне пришлось использовать associatedtype вместо любого конкретного типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...