使用RxDataSources使用TableViewSectionedDataSource绑定分段表,需要符合SectionModelType的部分。
此SectionModelType协议有以下初始化程序作为它的要求之一:
init(original: Self, items: [Item])此外,相同的协议强制执行var items: [Item] { get }。现在,我们可以从original.items或作为init参数传递的items初始化项数组支持变量(在上面提到的original.items中)。这很让人困惑。SectionModelType代码没有注释。
README的多么部分解释了本例中部分的创建,讨论了创建类型(用于关联值)和items数组,但没有一个字说明如何使用original: Self实现init:
init(original: SectionOfCustomData, items: [Item]) {
self = original
self.items = items
}虽然这可以在结构中工作,但在类呼喊中也可以这样做:
不能赋值:“自我”是不可变的
这里有人能解释一下这里发生了什么吗?为什么我们要用Self来解释?
最后,还有另一种(更干净的)方法(仅在RXSwift / RxCocoa中)将分段表视图绑定到可观察的数据源。例如:*我的单元格和部分有自己的数据模型,它们需要是可变的(因此是类)*对于不同的实体有多个屏幕具有这种要求,所以我会用协议来实现它,然后用协议扇相应的数据模型,ans对RXBinding有一个通用的实现。
任何可以让现有实现更加清晰的指针,或者实现以上几点,都是非常有用的。P.S.:我已经在使用Rx的庞大的代码库中工作,所以不使用Rx,或者迁移到SwiftUI等不是我想要的。
发布于 2020-03-19 23:02:03
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。您必须这样做,并且按照这样的顺序,因为如果不这样做,您将尝试在不设置SectionOfCustomData属性的情况下初始化一个header对象--但是,这样,我们就可以保证已经有一个header属性值,因为我们是从一个已经存在的SectionOfCustomData对象开始的,而如果不设置它的header属性,您就无法创建一个对象。
至于你的另一个担心,如果这是一个类,而不是一个结构,那就不会编译:是的,你是完全正确的,但是不要这样做。这不是他们说的。他们说让这成为一个结构,他们是认真的。
https://stackoverflow.com/questions/60764306
复制相似问题