函数式swift
应公司要求阅读这本书并作相关笔记:
函数式编程的核心理念就是 函数是值,它和结构体、整型或是布尔型没有什么区别
柯里化:将一个接受多参数多函数变换为一系列只接受单个参数多函数;
高阶函数:接受其它函数作为参数多函数;
除了泛型,Swift 还支持 Any 类型,它能代表任何类型的值。从表面上看,这好像和泛型极其相似。Any 类型和泛型两者都能用于定义接受两个不同类型参数的函数。然而,理解两者之间 的区别至关重要:泛型可以用于定义灵活的函数,类型检查仍然由编译器负责;而 Any 类型则 可以避开 Swift 的类型系统 (所以应该尽可能避免使用)。
最近研究RX-swift,对rx有了一些初步的认识,对函数式swift也进一步了解了;(暂时只做一些基本的了解,等当前项目完成,准备再系统等学习rx)一下是自己对rx的一些认识;
1 Rx 的基本概念,有观察者观察一个序列,每当序列发射值的时候,观察者根据序列做一些事情。
/**
观察者需要一个订阅序列的功能:
class Observable<Element> {
func subscribe(observer: Observer<Element>) -> Disposable
}
protocol ObserverType {
func on(event: Event<Element>)
}
通过序列的这个 subscribe 来订阅序列。这里就应该提到序列的“冷”“热”问题。
冷:只有当有观察者订阅这个序列时,序列才发射值;
热:序列创建时就开始发射值。
整体上就是这样的一个关系,序列发射值,观察者订阅序列,收到值,进行处理。
*/
//1---------- RX的创建
/**
asObservable 返回一个序列
create 使用 Swift 闭包的方式创建序列
deferred 只有在有观察者订阅时,才去创建序列
empty 创建一个空的序列,只发射一个 .Completed
error 创建一个发射 error 终止的序列
toObservable 使用 SequenceType 创建序列
interval 创建一个每隔一段时间就发射的递增序列
never 不创建序列,也不发送通知
just 只创建包含一个元素的序列。换言之,只发送一个值和 .Completed
of 通过一组元素创建一个序列
range 创建一个有范围的递增序列
repeatElement 创建一个发射重复值的序列
timer 创建一个带延迟的序列
*/
//2----------- Subject
/**
把 Subject 当作一个桥梁(或者说是代理), Subject 既是 Observable 也是 Observer 。
Subject 有以下几种:
PublishSubject 只发射给观察者订阅后的数据。
ReplaySubject
BehaviorSubject
Variable
*/
//3----------- map
/**
map 就是用你指定的方法去变换每一个值. 变换一个序列发射的值。这样我们的序列功能就强大了许多,创建,然后进行变换。
*/
//4----------- flatMap
/**
将一个序列发射的值转换成序列,然后将他们压平到一个序列。
用于数据异步变换或者更复杂的变换
*/
自己测试后rx在tableview的一些认识:
tableView.dataSource = nil
tableView.delegate = nil
dataSource.asObservable()
// .map { $0.sort(>) } 这里的map作用相当于你对数据的一些提前操作,这里使用sort函数对BasicModel进行排序操作,按照年龄大到小排列(我 的理解是BasicModel里对属性做了哈西化,且age属性在Comparable接口中做了比较--这部分可忽略)
.bindTo(tableView.rx_itemsWithCellIdentifier("BasicCell", cellType: BaseTableViewCell.self)) { (_, element, cell) in
cell.nameLabel.text = element.name
cell.ageLabel.text = String(element.age)
}.addDisposableTo(disposeBag)
//bindTo--将数据实时的绑定到 View 上
//我的理解:柯里化后这里rx_itemsWithCellIdentifier返回 configureCell ->Disposable,在此传入一个闭包当作configureCell的参数,最后 返回Disposable,我们的赋值操作就在闭包里完成,在程序运行过程中,只要将需要的数据放入到dataSource属性,就会完成自动赋值,也不存在中间过程这一 说了。
dataSource.value.appendContentsOf(BaseTableViewController.initialValue)
/**
* Select
*/
tableView.rx_modelSelected(BasicModel)
.subscribeNext { model in
Alert.showInfo(model.name, message: "\(model.age)")
}.addDisposableTo(disposeBag)
//subscribe可以看作一个订阅者,作为订阅者,收到这个数据model,就进行某些相应;
浙公网安备 33010602011771号