RxSwiftRxCocoa的以下示例代码是做什么的?

RxSwiftRxCocoa的以下示例代码是做什么的?,第1张

概述我想详细了解 .drive(resultsTableView.rx_itemsWithCellIdentifier("WikipediaSearchCell", cellType: WikipediaSearchCell.self)) { (_, viewModel, cell) in cell.viewModel = viewMod 我想详细了解
.drive(resultstableVIEw.rx_itemsWithCellIDentifIEr("WikipediaSearchCell",cellType: WikipediaSearchCell.self))           { (_,viewmodel,cell) in              cell.viewmodel = viewmodel          }

来自维基百科SearchVIEwController.swift第47-64行.
我试图提取参数来查看具体的类型签名,但是重写

let temp1 = searchbar.rx_text        .asDriver()        .throttle(0.3)        .distinctUntilChanged()        .flatMapLatest { query in            API.getSearchResults(query)                .retry(3)                .retryOnBecomesReachable([],reachabilityService: ReachabilityService.sharedReachabilityService)                .startWith([]) // clears results on new search term                .asDriver(onErrorJustReturn: [])        }        .map { results in            results.map(SearchResultviewmodel.init)    }    let driveArg1 = resultstableVIEw.rx_itemsWithCellIDentifIEr("WikipediaSearchCell",cellType: WikipediaSearchCell.self)    let driveArg2 = { (_,viewmodel: SearchResultviewmodel,cell: WikipediaSearchCell) in        cell.viewmodel = viewmodel    }    temp1.drive(driveArg1,currIEdArgument: driveArg2)        .adddisposableto(disposeBag)

cannot invoke ‘rx_itemsWithCellIDentifIEr’ with an argument List of type ‘(String,cellType: UItableVIEwCell.Type)’

对于driveArg1和

type of Expression is ambiguous without more context

对于driveArg2.

驱动器和rx_itemsWithCellIDentifIEr的签名是

public func drive<R1,R2>(with: Self -> R1 -> R2,currIEdArgument: R1) -> R2 {}public func rx_itemsWithCellIDentifIEr(cellIDentifIEr: String,cellType: Cell.Type = Cell.self)(source: O)(configureCell: (Int,S.Generator.Element,Cell) -> VoID) -> disposable {}

但在这一点上,Swift语法对我来说是不可理解的.任何人都可以解释签名,代码中会发生什么?

在这里,由于缺少上下文,Swift编译器无法推断出driveArg1和driveArg2的类型.当在drive()调用中使用内联时,编译器有更多的线索,每个参数的类型可以是什么,我们最终不需要为这些类型注释.

考虑到这一点,我们尝试为这两个变量添加类型注释.

首先,我们将使用swift 2.2更新rx_itemsWithCellIDentifIEr的签名,从而消除令人困惑的currying语法,并添加通用注释

public func rx_itemsWithCellIDentifIEr  <S: SequenceType,Cell: UItableVIEwCell,O : ObservableType where O.E == S>  (cellIDentifIEr: String,cellType: Cell.Type = Cell.self)    -> (source: O)    -> (configureCell: (Int,Cell) -> VoID)     -> disposable

driveArg2的类型

这是我们传递给currIEdArgument的驱动()的参数,并且将是在应用(source:O)之后传递给rx_itemsWithCellIDentifIEr的参数.因此,它需要匹配(Int,Cell) – >空虚

这种类型定义中有两个未知的,S.Generator.Element和Cell.它们是通用的,所以我们需要弄清楚它们是什么.

> Cell很容易,它是我们要配置的单元格的类型,这里是WikipediaSearchCell.
> S.Generator.Element有点困难,但我们可以很容易地弄清楚.我们从O.E == S得到,序列的类型是我们在源元素的尖括号之间找到的类型.在我们的例子中,source(temp1)的类型为Observable< [SearchResultviewmodel]>.所以S的类型是[SearchResultviewmodel],因此S.Generator.Element将是SearchResultviewmodel

好,我们现在有driverArg2的签名:

(Int,SearchResultviewmodel,WikipediaSearchCell) -> VoID

为了简化接下来的内容,我们为它定义一个typealias

typealias CellConfigurator = (Int,WikipediaSearchCell) -> VoID

我们现在可以定义driveArg2

let driveArg2: CellConfigurator = { (_,cell: WikipediaSearchCell) in    cell.viewmodel = viewmodel}

driveArg1的类型

现在,driveArg2已经失败了,找出driveArg1的类型变得更加容易.它只是rx_itemsWithCellIDentifIEr的返回类型,替换了通用部分

typealias DriveArg2Type = (source: Observable<[SearchResultviewmodel]>) -> (CellConfiguration) -> disposable

驱动签名

随着所有这一切的扩大,驱动器的类型签名希望更有意义:

drive(Self -> R1 -> R2,currIEdArgument: R1) -> R2// whereSelf = Observable<[SearchResultviewmodel]>R1 = CellConfiguratorR2 = disposable
总结

以上是内存溢出为你收集整理的RxSwift / RxCocoa的以下示例代码是做什么的?全部内容,希望文章能够帮你解决RxSwift / RxCocoa的以下示例代码是做什么的?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1026214.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存