[英]RxDataSources `Generic parameter 'Self' could not be inferred`
[英]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 數組,但沒有提及以下init
與original: 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.