首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SectionModelType在RxDataSources中的“自”要求与init的清晰性

SectionModelType在RxDataSources中的“自”要求与init的清晰性
EN

Stack Overflow用户
提问于 2020-03-19 20:06:32
回答 1查看 239关注 0票数 0

使用RxDataSources使用TableViewSectionedDataSource绑定分段表,需要符合SectionModelType的部分。

SectionModelType协议有以下初始化程序作为它的要求之一:

代码语言:javascript
复制
    init(original: Self, items: [Item])

此外,相同的协议强制执行var items: [Item] { get }。现在,我们可以从original.items或作为init参数传递的items初始化项数组支持变量(在上面提到的original.items中)。这很让人困惑。SectionModelType代码没有注释。

README的多么部分解释了本例中部分的创建,讨论了创建类型(用于关联值)和items数组,但没有一个字说明如何使用original: Self实现init

代码语言:javascript
复制
init(original: SectionOfCustomData, items: [Item]) {
    self = original
    self.items = items
}

虽然这可以在结构中工作,但在类呼喊中也可以这样做:

不能赋值:“自我”是不可变的

这里有人能解释一下这里发生了什么吗?为什么我们要用Self来解释?

最后,还有另一种(更干净的)方法(仅在RXSwift / RxCocoa中)将分段表视图绑定到可观察的数据源。例如:*我的单元格和部分有自己的数据模型,它们需要是可变的(因此是类)*对于不同的实体有多个屏幕具有这种要求,所以我会用协议来实现它,然后用协议扇相应的数据模型,ans对RXBinding有一个通用的实现。

任何可以让现有实现更加清晰的指针,或者实现以上几点,都是非常有用的。P.S.:我已经在使用Rx的庞大的代码库中工作,所以不使用Rx,或者迁移到SwiftUI等不是我想要的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-19 23:02:03

init(original:items:)是一个副本初始化程序。它接受已经存在的结构实例,并生成一个相同的新实例,只不过它更改了items属性中的内容。

因此,在协议声明中,init(original: Self, items: [Item])意味着:“您给我一个已经存在的符合我的任何类型的实例,协议,我们将创建一个新的实例,在更改它的items时复制它。”

这正是这个例子所做的。如果你把所有的东西都放在一起就更容易了,就像这样:

代码语言:javascript
复制
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属性,您就无法创建一个对象。

至于你的另一个担心,如果这是一个类,而不是一个结构,那就不会编译:是的,你是完全正确的,但是不要这样做。这不是他们说的。他们说让这成为一个结构,他们是认真的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60764306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档