我想详细了解
.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
// where
Self = Observable<[SearchResultviewmodel]>
R1 = CellConfigurator
R2 = disposable

RxSwift / RxCocoa的以下示例代码是做什么的?的更多相关文章

  1. ios – RxSwift:返回一个带有错误的新observable

    我有一个函数返回BoolObservable,具体取决于它是否正常.解决方法返回包含单个元素的可观察序列.相反,你应该使用这样的东西:Create方法从指定的subscribe方法实现创建一个可观察的序列.在你的情况下:Anonymousdisposable是在您想要中断的情况下调用的操作.假设您离开视图控制器或应用程序需要完成该服务,您不再需要再调用此请求.它非常适合视频上传或更大的内容.您可以

  2. ios – RxSwift:使用rx_refreshing进行uirefreshcontrol

    我正在使用UIRefreshControl变量绑定来重新加载数据.然而,它正在起作用,以下对我来说是错误的:1)我知道RXCocoa扩展中有一个rx_refreshing变量,但我无法让它在这个上下文中工作.2)我绑定答案两次.一旦我加载视图控制器,当UIRefreshControl刷新时再次加载.3)我检查UIRefreshControl是否令人耳目一新的部分看起来很尴尬.感觉它是否违背了使用反应的目的?

  3. ios – 将UIApplicationDelegate方法转换为RxSwift Observables

    得到打印然后我在RxCocoa的_RXDelegateProxy_类中得到以下崩溃:有谁知道问题可能是什么?或者有没有人成功实现过像rx_applicationDidBecomeActive这样的东西?

  4. 在实践中应用 RxSwift

    注:本文基于Swift3。Swift大会上有一场POP的分享,Demo地址RxPagination。摘要在上一篇在实践中应用RxSwift1-使用Result传递值中,我们解决了error的处理,但当我们处理一段很长的事件流时,会发现有很多不重要的代码,比如传递Error。在Rx中,map和flatMap是最常用的,我们添加一些小工具。以此表示这个方法是用在flatMap上的。关于为什么FlatMap中会有filter,您可以参考这篇文章用更Swifty的代码遍历数据。

  5. RxSwift使用教程

    前言RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发,维护。RxSwift的目的是让让数据/事件流和异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程目前,RxSwift在Github上收到了5000+Star,600+fork。RxSwift的核心思想和这个类似。RxSwift的核心是想是Observablesequence,Observable表示可监听或者可观察,也就是说RxSwift的核心思想是可监听的序列。

  6. 初识RxSwift及使用教程 韩俊强的博客

    RxSwift是Swift函数响应式编程的一个开源库,由Github的ReactiveX组织开发、维护其他语言像C#,Java和JS也有,Rx.Net、RxJava、RxJSRxSwift的目的是让让数据/事件流和异步任务能够更方便的序列化处理,能够使用Swift进行响应式编程函数式响应编程?

  7. RxSwift使用教程大全 韩俊强的博客

    记录大多数ReactiveX的概念和操作符。我们还需要使用KVO来检测变量的值改变。Rx就是为解决这些问题而生的。Observable理解RxSwift的关键是理解Observable的概念。使用variable的好处是variable将不会显式的发送Error或者Completed。

  8. RxSwift 基础

    幸运的是,我们能够通过RxSwift优雅的处理异步代码。通过使用不可变代码定义异步处理输入,RxSwift以一种确定可组合的形式对事件做出响应。ObservableObservable类可以说是RxSwift整个框架的基石。补充值得注意的是,RxSwift并没有对客户端的应用架构作出硬性规定。这意味着,我们可以在已有项目中引入RxSwift进行响应式编程实践。当然已有框架中必定存在一个最适合RxSwift的,而它就是MVVM。总结作为系列开篇,本文介绍了RxSwift的一些基本理念和构成,更多相关的内容将

  9. RxSwift 之 Observable

    --more-->在前一篇基础之上,本文我们将会介绍RxSwift中的Observables部分。在RxSwift中Observable也被称为ObservableSequence、Sequence、Stream。Observable会以异步的方式不断的发射事件形成事件流,并且数据也会沿着事件流进行传播。Observable生命周期上图中的三个圆圈其实就是RxSwift中的next事件。订阅Observable在日常iOS编程中,通知模式可以说是使用频率相当高的一个设计模式。更为重要的是,在没有订阅者的时

  10. RxSwift 之变换操作

    可能刚开始接触RxSwift时候,你会觉得RxSwift非常难懂也不容易学。不过我相信认知读了前几篇文章后,你会深感RxSwift的强大。这篇文章将会继续介绍另一组非常重要的RxSwift操作:TransformingOperator。RxSwift中实现此功能最简单的方法就是通过toArray操作。而flatMap在RxSwift中的操作过程如下图:图中第一行O1、O2、O3表示三个类型实例,然后该类型实例有一个可观察属性value。总结本文简单了介绍了RxSwift中一些常见的变换操作。

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部