在开始学习 RxSwift 之前,一定要对 Swift 相关语法有所了解,否则就很难理解为什么可以这样。关于 Swift 的学习其实只要看看 Swift 的官方文档就可够了。我之前也列过一些学习资源:来自一线开发者的Swift学习资源推荐。
现在开始进入正题。

Swift的优势

想一个有趣的问题,为什么没有 RxObjc 呢?
实际上响应式的编程框架对语言还是有些要求的,当然 OC 确实也有一个奠基式的 FRP 框架 ReactiveCocoa。但是客观的说,在 Swift 里响应式的框架写起来会愉快的多,或者说更能发挥出语言的优势。
Swift 契合响应式有以下几点:

  • 强类型,强类型的泛型
  • 灵活的闭包
  • 对并发模型的原生支持(Swift 5 的特性,还未发布

Enum的关联值和泛型

Swift 中的枚举(Enum)能力相比 OC 可以说得到了升华。不再只是一个类似预编译时的宏,而是一个完整的类型。和 Struct 一样,可以给他定义初始化方法,声明函数,添加扩展。同样的泛型同样也试用于 Enum。
枚举还有一项神奇的能力叫关联值。一个枚举可以的值可以是不同的类型。官方手册里的示例代码如下:

enum ServerResponse {case result(String, String)case failure(String)
}let success = ServerResponse.result("6:00 am", "8:09 pm")
let failure = ServerResponse.failure("Out of cheese.")switch success {
case let .result(sunrise, sunset):print("Sunrise is at \(sunrise) and sunset is at \(sunset).")
case let .failure(message):print("Failure...  \(message)")
}复制代码

每个 case 可以携带不同的类型,并且可以不止是一个值。
当 Enum 结合泛型,就发生了有趣的事。直接贴代码:

enum OptionalValue<Wrapped> {case nonecase some(Wrapped)
}var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some(100)复制代码

这就是 Swift 中的 Optional 实现的类似代码。使用枚举实现,表示值有两种可能:没有值的 .none 和是 Wrapped 类型的 .some。
有了以上的知识我们再来看 Rx 中的事件流中的值Event

public enum Event<Element> {/// Next element is produced.case next(Element)/// Sequence terminated with an error.case error(Swift.Error)/// Sequence completed successfully.case completed
}复制代码

每一次事件的值有三种可能:1.值(next),2.完成结束(completed),3.失败(error)。

函数的默认参数

如果函数在声明时设置了一个默认值,那么在调用时这个参数就可以不传。
假设我们给 Int 定义个扩展方法increment。如果不传入值则默认加1,如果传入就按照传入的值增加:

extension Int {func increment(with number: Int = 1) -> Int {return self + number}
}复制代码

使用的时候 Xcode 就会提示两个函数:

不再需要像 OC 一样定义几个函数。
Rx 表示订阅的subscribe函数,有时只要写onNext,有时只要写onError,就是因为这个函数在声明时同时指定了默认参数:

extension ObservableType {public func subscribe(file: String = #file,line: UInt = #line,function: String = #function,onNext: ((E) -> Void)? = nil,onError: ((Swift.Error) -> Void)? = nil, onCompleted: (() -> Void)? = nil,onDisposed: (() -> Void)? = nil)-> Disposable {// ...}复制代码

可以看到这个函数为订阅每个事件可能都声明了默认参数,所以你在订阅时可以只订阅自己关注的订阅。

闭包

闭包的使用类似 OC 中的 block,具体使用就不再介绍。提一下新手很容易忽略的语法糖。

闭包简化语法

  • 闭包参数、返回值类型自动推断
    因为 Swift 是强类型语言,闭包的参数的类型可以推断出来。比如如下代码:

    reversedNames = names.sorted(by: { (s1: String, s2: String) -> Bool inreturn s1 > s2
    })复制代码

    s1 和 s2 的类型和返回值类型 Xcode 可以推断出来可以省略:

    reversedNames = names.sorted(by: { (s1, s2)  inreturn s1 > s2
    })复制代码
  • 闭包表达式只有一行,可以省略return
    因为只有一行,表达式执行的结果肯定就是要返回的值,所以可以省略。接上面的代码可以优化成这样:

    reversedNames = names.sorted(by: { (s1, s2)  in   s1 > s2
    })复制代码
  • 用$N代替参数
    有时实参的参数名没什么用,可以直接用$N代表实参,$0代表第一个参数。上面的代码进行这样的简化后就写成了这样:

    reversedNames = names.sorted(by:  { $0 > $1 })复制代码
  • 二元运算时可以直接省略只用操作符表示
    当表达式只有一行时,二元运算的表达式可以直接省略到只剩一个运算符,上面的可以省略为:

    reversedNames = names.sorted(by:  >)复制代码

尾闭包

当参数的最好一个参数是闭包时,可以直接把最后一个闭包的实现跟在函数后面。
直接贴代码表示:

// 一个最后一个参数是闭包的函数
func someFunctionThatTakesAClosure(closure: () -> Void) {// function body goes here
}// 默认的调用方法
someFunctionThatTakesAClosure(closure: {// closure's body goes here
})// 省略最后一个参数的方法名,并且把闭包的实现直接跟在函数后面
someFunctionThatTakesAClosure() {// trailing closure's body goes here
}复制代码

这种写法简化了代码,让代码看起来更简洁。

Rx 中的数据流操作符可以灵活的组织闭包,经常会用到简化的闭包的语法。

  Observable.of(1, 2, 3, 4, 5, 6).filter { $0 % 2 == 0}.subscribe(onNext: {print($0)
})复制代码

刚开始的时候可能有点看不明白,慢慢的还原闭包的语法,之后看多了就会熟悉的。

欢迎关注我的微博:@没故事的卓同学

RxSwift之路 1#Swift语法知识准备相关推荐

  1. 有 OC 经验的程序员快速学习 Swift 语法

    前言 苹果官方推出 Swift 语言至今,已经过了 7 年之久,Swift 也更新到了 5.5 版本, 它的语法和 API 也趋向于稳定.最近闲来无事,决定开始研究这 iOS 开发编程语言的语法.因为 ...

  2. Swift基础知识概述

    第二章: Swift基础知识概述 1. 三件事 学习Swift语言 学习Xcode 理解ios开发组件,API.SwiftUI.SDK等 从以上三个方面自己修练.不用担心. 2. 开始学习 首先看一段 ...

  3. python基础语法及知识总结-Python 学习完基础语法知识后,如何进一步提高?

    ---4.30更新---感谢大家支持,点赞都破两千了.给大家整理出来新的资料,需要的小伙伴来自取: Python练手项目视频如下: Python自学基础知识如下: 以下为原文内容: Python 学习 ...

  4. python基础语法有哪些-Python基础语法知识有哪些?

    相信大家都听过Python除了不会生孩子,基本上无所不能的段子,这一定程度上反映了目前Python编程语言的火爆程度和广泛应用.然而,对于许多零基础的Python学习者来说,常常会遇到无从学起,找不到 ...

  5. python初中必背语法_初中必背英语语法知识汇总

    原标题:初中必背英语语法知识汇总 语法是中考英语考试必考点.语法知识掌握得好,将大大加快英语学习的进程.本文归纳了词法和八种基本时态,希望对广大初中学子有所帮助. 词法 名词 (1)名词的可数与不可数 ...

  6. Swift翻译之-Swift语法入门 Swift语法介绍

    目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...

  7. oracle语法官方文档,Oracle官方文档必备语法知识

    很多Oracle DBA虽然接触Oracle时间很长,但是一旦想不起语法或找不出相应参数时,习惯百度或谷歌.虽然已经下载了官方文档,但是 Oracle官方文档必备语法知识 [日期:2015-04-21 ...

  8. cmakelists语法_CMakeList语法知识

    在写这篇文章之前开始是想一些shell脚本与Makefile的一些基础语法知识.但是又觉得太过基础.关于Liunx shell脚本可以看看教程http://c.biancheng.net/linux_ ...

  9. php基础语法知识笔记(一)

    共享一份我自己学习php基础语法知识的笔记,这是第一弹,明天共享第二弹. 1.判断php短标记<??>是否适用,查看php配置文件php.ini中的"short_open_tag ...

最新文章

  1. Python函数参数的五种类型
  2. mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
  3. 聚类之hierachical clustering算法
  4. centos 6.8安装git_CentOS7安装GitLab、汉化、邮箱配置及使用
  5. 关于SVN服务器的环境搭建及使用(转)
  6. Android 倒计时——Timer和CountDownTimer的使用,实现启动,暂停,继续,重复,重设时长以及启动service后台倒计时
  7. jackson 反序列化string_Jackson序列化和反序列化
  8. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期上涨0.54%
  9. html 可换行属性,html里title属性换行的方法
  10. 阶段3 1.Mybatis_06.使用Mybatis完成DAO层的开发_1 Mybatis中编写dao实现类的使用方式-查询列表...
  11. Coin3D三维可视化教程4
  12. 码农与程序员两种不同称呼,有什么本质上的区别?
  13. 接入Paypal 实现跨境支付 - springboot实战电商项目mall4j
  14. Echarts世界国家中英文对照
  15. java短学期教师总结_短学期心得体会(共10篇).docx
  16. jieba分词增加自定义词表
  17. Windows程序设计-剪贴板
  18. 蓝牙学习五(广播包分析wireshark)
  19. 做外贸用什么邮箱,外贸邮箱用哪个好
  20. 机器学习实用指南:这些基础盲点请务必注意!

热门文章

  1. Java Math的 floor,round和ceil的总结 ,java基础知识
  2. php add 返回id,PHP curl_multi_close函数
  3. java基础数据结构查询最快_Java 数据结构快速入门
  4. 实数系的基本定理_初中篇1|知实数-为什么0.9的循环等于1?
  5. ppt提示内存或系统资源不足_为何手机一直提示内存不足?原来是它们惹的祸,赶紧清了...
  6. android app 主界面,android ViewPager实现App主界面Tab菜单页面切换和点击事件
  7. android studio真机模拟不能拍照_android和ios静态库的生成
  8. php 缺少 wordpress,Wordpress localhost安装错误 - 您的PHP安装似乎缺少WordPress所需的MySQL扩展程序...
  9. 推荐的Oracle书籍
  10. HTML基础-张晨光-专题视频课程