一: 面向协议编程
1.1 传统的面向对象思维方式:
- 有一只狗,有自己的名字, 可以跑
- 有一只猫,有自己的名字, 可以跑
- 有一个人,有自己的名字, 可以跑
- 抽象出一个动物类, 之后, 将跑的行为放入动物类中
- 如果需要一个吃的行为, 也可以抽象在动物类中
1.2 面向对象开发弊端
如果有一辆车, 也有跑的行为, 这个时候如何抽象呢, 显然该抽象方式并不是特别合理
1.3 真实开发中的场景
对UIViewController
/UITableViewController
/ UICollectionViewController
抽象相同的方法
面向对象开发核心是: 封装-继承-(多态)
1.4 面向协议示例
- Swift 标准库中有 50 多个复杂不一的协议,几乎所有的实际类型都是满足若干协议的
- 面向协议开发核心是: 模块化(组件化)
- 面向协议开发应用:
- 粒子动画效果实现, 抽取在单独的协议中, 如果有控制器需要, 实现我的协议即可
- 很多
UIView
会通过xib
进行描述, 而我们经常需要从一个xib中加载UIView, 抽取单独的协议, 需要从xib中加载类, 只需要遵守协议即可
二: 网络请求(使用面向协议方式进行开发)
protocol Requestable {
var method : HttpMethod { get }
var host : String { get }
var path : String { get }
var parameters : [String : Any] { get }
associatedtype ResultType : Decodable
}
extension Requestable {
func request(completion : @escaping (ResultType?) -> Void) {
// 1.创建URL
let url = URL(string: host + path)!
// 2.创建request对象
let request = URLRequest(url: url)
// 3.通过URLSession发送请求
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, _, error) in
completion(ResultType.parse(data!))
})
// 4.发起请求
task.resume()
}
}
protocol Decodable {
static func parse(_ data : Data) -> Self?
}