RxSwift之路 1#Swift语法知识准备
RxSwift之路 1#Swift语法知识准备
在开始学习 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 none
case some(Wrapped)
} var possibleInteger: OptionalValue<Int> = .none
possibleInteger = .some()
这就是 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 = ) -> 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 in
return s1 > s2
})
s1 和 s2 的类型和返回值类型 Xcode 可以推断出来可以省略:
reversedNames = names.sorted(by: { (s1, s2) in
return s1 > s2
}) - 闭包表达式只有一行,可以省略
return
因为只有一行,表达式执行的结果肯定就是要返回的值,所以可以省略。接上面的代码可以优化成这样:reversedNames = names.sorted(by: {
(s1, s2) in s1 > s2
}) - 用$N代替参数
有时实参的参数名没什么用,可以直接用$N代表实参,$0代表第一个参数。上面的代码进行这样的简化后就写成了这样:reversedNames = names.sorted(by: { $ > $ })
- 二元运算时可以直接省略只用操作符表示
当表达式只有一行时,二元运算的表达式可以直接省略到只剩一个运算符,上面的可以省略为: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(, , , , , )
.filter { $ % == }
.subscribe(onNext: {
print($)
})
刚开始的时候可能有点看不明白,慢慢的还原闭包的语法,之后看多了就会熟悉的。
RxSwift之路 1#Swift语法知识准备的更多相关文章
- RxSwift之路 2#如何开始
RxSwift之路 2#如何开始 第一步当然是把项目clone到本地,github地址:https://github.com/ReactiveX/RxSwift. 官方文档 学习的第一手资源当然是项目 ...
- 那点你不知道的XHtml(Xml+Html)语法知识(DTD、XSD)
什么是XHtml: 摘录网上的一句话,XHTML就是一个扮演着类似HTML的角色的XML. XHtml可当模板引擎应用: CYQ.Data 框架里有一套XHtmlAction模板引擎, 应用在QBlo ...
- Swift语法入门
正文参考: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Progra ...
- ios -- 教你如何轻松学习Swift语法(三) 完结篇
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.自动引用计数 1.自动引用计数工作机制 1.1 swift和o ...
- ios -- 教你如何轻松学习Swift语法(二)
前言:swift语法基础篇(二)来了,想学习swift的朋友可以拿去参考哦,有兴趣可以相互探讨,共同学习哦. 一.可选类型(重点内容) 1.什么是可选类型? 1.1在OC开 ...
- ios -- 教你如何轻松学习Swift语法(一)
目前随着公司开发模式的变更,swift也显得越发重要,相对来说,swift语言更加简洁,严谨.但对于我来说,感觉swift细节的处理很繁琐,可能是还没适应的缘故吧.基本每写一句代码,都要对变量的数据类 ...
- Swift翻译之-Swift语法入门 Swift语法介绍
目录[-] Hello world - Swift 简单赋值 控制流 函数与闭包 对象和类 枚举与结构 协议和扩展 泛型 2014.6.3日,苹果公布最新编程语言Swift,Swift是一种新的编程语 ...
- Swift语法总结补充(一)
Swift基础语法学习总结Swift高级语法学习总结Swift语法总结补充(一) 1. 可选类型是一种类型,String?就是Optional<String>,所以函数参数也可以声明为它2 ...
- Swift语法
Swift语法 标签(空格分隔): Swift 1.打印输出语句 println("Hello, Swift!") 注意每行代码后面无需添加分号作为结束 2.简单值 let---常 ...
随机推荐
- linux 学习笔记 rpm命令
软件包管理 用rpm命令来管理rpm 软件包 1>遵循GPL 规则 2>安装 foo-2.0-1.i386.rpm软件包 #rpm -ivh foo-1.0-1.i386.rpm 3> ...
- 自己总结的C#编码规范--5.如何写好注释篇
本文是读完前言中提到的几本书后,结合自身的想法总结出来的如何写好注释的一些比较实用的方法. 另外本文是上一篇 注释篇 的一个补充 如何写好注释 避免使用不明确的代词 有些情况下,"it&qu ...
- 《动物世界》的剪刀石头布 HDU --- 6418
题目连接: https://vjudge.net/problem/1812686/origin emmm 这一题的资料来自<动物世界>这一个李易峰演的电影.. 主要的思路就是概率,但是会牵 ...
- Windows下bat脚本自动发邮件
摘要:说明:很多木马会利用自身的程序截取系统敏感文件或信息发往指定的邮箱,而blat并不是木马,它小巧却有强大的发邮件功能,可不要用它做违法事,感觉和木马功能有一拼!下面先看个具体的实例(在blat同 ...
- 第一章 初始STM32
1.3什么是STM32? ST是意法半导体,M是MIcroelectronisc的缩写,32表示32位. 合起来就是:ST公司开发的32位微控制器. 1.4 STM32 能做什么? STM32属于一个 ...
- 2017.07.06【NOIP提高组】模拟赛B组
Summary 今天比赛感觉题目很奇葩,都可以用许多简单方法来做,正确性都显然,当然也有点水,也就是说是考我们的数感和数学知识,而程序,只是代码的体现. 这次的时间安排感觉不错,因为很快就打完最后一道 ...
- HTTP1.1协议-RFC2616-中文版课前资料收集
1.http rfc大致讲了什么? 2.解决了什么问题? HTTP协议描述的是发送方与接收方的通信协议 协议功能: HTTP协议(HyperText Transfer Protocol,超文本传输协议 ...
- JAVA自学作业01
JAVA自学作业01 1.Hello World 程序 class HelloWorld{ public static void main(String args[]){ System.out.pri ...
- jQuery 学习04——遍历:定义、向上、向下、同级、过滤
Query 遍历,意为"移动",用于根据其相对于其他元素的关系来"查找"(或选取)HTML 元素. 以某项选择开始,并沿着这个选择移动,直到抵达您期望的元素为止 ...
- __c语言__测一段代码的运行时间
2017-09-16 13:35:56 感觉很实用. /************************************** time ./a.out 命令所花费的real时间.user时间和 ...