Приведение к протоколу ограничено связанным типом - PullRequest
0 голосов
/ 12 июля 2020

Я определил протокол следующим образом:

protocol CustomCell where Self: UICollectionViewCell {

    associatedType Config
    var cellConfiguration: Config!
    func setup(with configuration: Config)

}

Затем у меня есть пользовательский UICollectionViewCell:

class RedCollectionViewCell: UICollectionViewCell, CustomCell {

    var cellConfiguration: RedCollectionViewCellConfiguration!

    func setup(with configuration: Config) {
       ...
    }

   ...awakeFromNib and other functions...

}

, где RedCollectionViewCellConfiguration определено:

class RedCollectionViewCellConfiguration: NSCoding {
     ...
}

Конечная цель состоит в том, чтобы иметь много различных настраиваемых UICollectionViewCell, которые все соответствуют CustomCell, каждый из которых определяет свой собственный класс конфигурации (поскольку для каждого типа настраиваемой ячейки представления коллекции потребуется другая конфигурация, поскольку они будут содержать разные типы данных). Я планирую сохранить конфигурацию ячейки в Core Data, а затем получить ее в ViewController.collectionView(_:cellForItemAt:). В ViewController.collectionView(_:cellForItemAt:) я пытаюсь сделать это:

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath)
if let cell = cell as? CustomCell {
    cell.setup(tile,with: configuration)
}

и в результате понижающего преобразования получаю следующую ошибку: Протокол CustomCell можно использовать только как общий c, потому что у него есть требования к типу Self или связанному типу

Я видел другие ответы на Stack Overflow, но ни один из них не помог. Есть ли альтернативный способ решения этой проблемы? Я рассмотрел вариант исключения connectedType & cellConfiguration в CustomCell, но было бы идеально, если бы все соответствующие типы имели уникальный класс конфигурации.

1 Ответ

0 голосов
/ 12 июля 2020

Очевидно, вам нужно удалить связанный тип, так как generi c находится на вашем пути, и вам никогда не понадобился generi c в первую очередь. Протокол вам тоже не нужен. Нечего унифицировать.

Подумайте об этом: «каждый определяет свой собственный класс конфигурации». Для меня это не имеет смысла. Как это будет работать? Что могло бы объединить эти классы? И зачем им объединяться?

Лично я не понимаю, почему вы просто не используете разные подклассы ячеек, каждый из которых объявляет свой собственный метод конфигурации, тип данных конфигурации и т. Д. c., И оставляете это при том. Это то, чем я занимаюсь. Помните, что класс может просто объявлять свой собственный внутренний материал, включая типы данных. Итак, вы можете просто сказать, что именно вы пытаетесь сказать:

if let cell = cell as? CustomCell {
    cell.setup(tile,with: configuration)
}

, потому что и setup, и любой тип configuration - это просто вещи, определенные внутри CustomCell. Ни связанного типа, ни протоколов, ни универсальных шаблонов, ничего.

class CustomCell: UITableViewCell {
    struct Config { // ...
    func setup(with config: Config) // ...
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...