Swift面向协议开发

一: 面向协议编程

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?
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容