1、面向协议编程
面向协议编程(简称POP)
是Swift的一种编程范式、Apple于2015年WWDC提出
在Swift的标准库中,能见到大量POP的影子
同时,Swift也是一门面向对象的编程语言(简称OOP)
在Swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方
2、扩展方法
给某个类扩展方法
// 前缀类型
struct MJ<Base> {
var base: Base
init(_ base: Base) {
self.base = base
}
}
// 利用协议扩展前缀属性
protocol MJCompatible { }
extension MJCompatible {
var mj: MJ<Self> { MJ(self) }
static var mj: MJ<Self>.Type { MJ<Self>.self }
}
// 让String拥有前缀属性
extension String: MJCompatible {}
// 给mj前缀扩展功能
extension MJ where Base : ExpressibleByStringLiteral {
var numberCount: Int {
let string = base as! String
var count = 0
for c in string where ("0"..."9").contains(c) {
count += 1
}
return count
}
static func test() {
}
}
// 类
class Person { }
class Student: Person { }
extension Person: MJCompatible {}
extension MJ where Base: Person {
func run() { }
static func test() {}
}
Person.mj.test()
Student.mj.test()
let p = Person()
p.mj.run()
let s = Student()
s.mj.run()
3、利用协议实现类型判断
// 实例判断是否是数组
func isArray(_ value: Any) -> Bool { value is [Any]}
isArray([1, 2])
isArray(NSArray())
// 利用协议类型判断是否是数组
protocol ArrayType { }
extension Array: ArrayType {}
extension NSArray: ArrayType {}
func isArrayType(_ type: Any.Type) -> Bool { type is ArrayType.Type }
isArrayType([Int].self)
isArrayType([Any].self)
isArrayType(NSArray.self)
isArrayType(NSMutableArray.self)
4、响应式编程
响应式编程(Reactive Programming,简称RP)
也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定
一般与函数式编程融合在一起,所以也会叫做:函数响应式编程(Functional Reactive Programming,简称FRP)
比较著名的,成熟的响应式框架
ReactiveCocoa
ReactiveX
5、RxSwift核心角色
Observable:负责发送事件(Event)
Observer:负责订阅Observable,监听Observable发送的事件(Event)
public enum Event<Element> {
case next(Element) //携带具体数据
case error(Swift.Error) // 携带错误信息,表明Observalbe终止,不会在发出事件
case completed // completed:表明Observable终止,不会再发出事件
}