Ясность при инициализации с требованием `Self` для SectionModelType в RxDataSources - PullRequest
0 голосов
/ 19 марта 2020

Для связывания секционированной таблицы с RxDataSources с использованием TableViewSectionedDataSource требуются секции, соответствующие SectionModelType .

This SectionModelType * Протокол 1010 * имеет следующий инициализатор в качестве одного из требований:

    init(original: Self, items: [Item])

Кроме того, тот же протокол обеспечивает var items: [Item] { get }. Теперь мы можем инициализировать переменную поддержки массива items (в упомянутом выше init) либо с original.items, либо с items, переданным в качестве параметра init. Это очень запутанно. Код SectionModelType не имеет комментариев.

Как раздел README, который объясняет создание разделов для этого самого случая, говорит о создании typealias (для связанного значения) и массива items, но не говорит о последующей реализации init с original: Self:

init(original: SectionOfCustomData, items: [Item]) {
    self = original
    self.items = items
}

Хотя это может работать в структуре, делает то же самое в классе и кричит:

Невозможно присвоить значение: 'self' is immutable

Может ли кто-нибудь здесь объяснить, что здесь происходит и почему нам НУЖНО начать с Self

Наконец, есть ли другой (более чистый) способ реагирования (в RXSwift / Только RxCocoa) привязать секционированное табличное представление к наблюдаемому источнику данных. например, * мои ячейки и секции имеют свою собственную модель данных, которая должна быть изменяемой (следовательно, классы) * есть несколько экранов с этим требованием для разных объектов, поэтому я был бы заинтересован в достижении этого с протоколами вместо этого, и ударил соответствующие Модель данных с протоколом и общей реализацией для RXBinding

Любые указатели, чтобы либо получить больше ясности относительно существующей реализации, либо достичь вышеуказанных пунктов, были бы очень полезны. PS: я уже работаю в огромной кодовой базе, которая использует Rx, поэтому я не использую Rx или перехожу на SwiftUI и т. Д. c - это не то, что я ищу.

1 Ответ

0 голосов
/ 20 марта 2020

init(original:items:) является инициализатором copy . Он берет уже существующий экземпляр структуры и создает новый, идентичный, за исключением того, что он изменяет то, что находится в свойстве items.

Таким образом, в объявлении протокола init(original: Self, items: [Item]) означает: «Вы передаете мне уже существующий экземпляр того типа, который соответствует мне, протоколу, и мы создадим новый экземпляр, который копирует его при изменении его items. "

И это именно то, что пример делает. Проще увидеть, соберете ли вы все это вместе, например:

protocol SectionModelType {
    associatedtype Item
    var items: [Item] { get }
    init(original: Self, items: [Item])
}
struct CustomData {
    var anInt: Int
    var aString: String
    var aCGPoint: CGPoint
}
struct SectionOfCustomData {
    var header: String
    var items: [Item]
}
extension SectionOfCustomData: SectionModelType {
    typealias Item = CustomData
    init(original: SectionOfCustomData, items: [Item]) {
        self = original
        self.items = items
    }
}

В вашей реализации расширения вам решать, что они сделали: установите self в original, это уже существующий объект SectionOfCustomData (который разрешен в инициализаторе структуры), а затем измените его items. И вы должны делать такие вещи и в таком порядке, потому что если вы этого не сделаете, вы попытаетесь инициализировать объект SectionOfCustomData без установки его свойства header - тогда как, таким образом, мы гарантируется, что существует уже значение свойства header, потому что мы начинаем с уже существующего объекта SectionOfCustomData, и вы не можете сделать один без , установив его свойство header .

Что касается вашего другого беспокойства, то, что это не скомпилируется, если это класс, а не структура: да, вы совершенно правы, но не делайте этого. Это не то, что они сказали делать. Они сказали, сделайте это структурой, и они это имели в виду.

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