簡體   English   中英

使用 RxDataSources 中 SectionModelType 的“Self”要求在初始化時清晰化

[英]Clarity on init with `Self` requirement of SectionModelType in RxDataSources

使用TableViewSectionedDataSource將分段表與RxDataSources綁定,需要符合SectionModelType 的部分

SectionModelType協議具有以下初始值設定項作為其要求之一:

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

此外,相同的協議強制執行var items: [Item] { get } 現在,我們可以初始化項目陣列背襯變量(在上面提到init與無論是從) original.items ,或items作為初始化參數傳遞。 這是非常令人困惑的。 SectionModelType 代碼沒有注釋。

解釋在這種情況下創建部分的 README 部分如何討論創建類型別名(用於關聯值)和 items 數組,但沒有提及以下initoriginal: Self實現的實現original: Self

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

雖然這可以在結構中工作,但在類中做同樣的事情:

無法分配給值:“self”是不可變的

這里的任何人都可以解釋這里發生的事情以及為什么我們需要用Self初始化

最后,是否有另一種(更干凈的)方式來反應性地(僅在 RXSwift / RxCocoa 中)將分段表視圖綁定到可觀察數據源。 例如 * 我的單元格和部分有自己的數據模型,需要是可變的(因此是類) * 有多個屏幕對不同的實體有這種要求,所以我很想用協議來實現這一點,並拍下相應的帶有協議的數據模型和 RXBinding 有一個通用的實現

任何指向更清晰地了解現有實現或實現上述要點的指針都會非常有幫助。 PS:我已經在使用 Rx 的龐大代碼庫中工作,因此不使用 Rx 或轉向 SwiftUI 等並不是我想要的。

init(original:items:)是一個復制初始值設定項。 它采用結構的一個現有實例,並創建一個相同的新實例,只是它更改了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允許),然后更改其items 並且您必須按照這樣的順序執行此類操作,因為如果不這樣做,您將嘗試初始化 SectionOfCustomData 對象而不設置其header屬性 - 而這樣,我們可以保證已經有一個header屬性值,因為我們從一個已經存在的 SectionOfCustomData 對象開始,如果設置它的header屬性,你就不能創建一個。

至於你的另一個擔憂,如果這是一個類,而不是一個結構,那將無法編譯:是的,你是完全正確的,但不要那樣做。 這不是他們說要做的。 他們說把它變成一個結構,他們是認真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM