swift pop 面向协议开发
尽管编程语言不一样,但是编程的思想都是互通的!
我们都知道 swift 的精髓在于面向协议编程, 那你们知道为什么我们要面向协议编程吗? 利用 swift 面向协议编程能带来什么好处.
如果我们想要达到一个需求
让很多的类具备同一个功能,同时我们希望能很方便的给他扩展一些其他类已具备功能....
方案 1:采用 copy.
每个类去copy 一下这个功能代码. 缺点:狗屎代码. 太麻烦,不好维护
方案 2:采用继承
写上一个基类. 需要使用这个功能的就去继承这个基类. 缺点: 继承最容易导致耦合. 而且 swfit 不支持多继承. 如果这个基类没有的功能就不方便了. 另外一个方面. 如果一条狗有吃的功能, 创建一个人类也要有吃的功能, 总不至于让人类去继承狗类吧. 不太友好,不利于理解.....
方案 3: 终极解决方案----协议+扩展
针对某个要实现的功能,我们可以使用协议定义出接口,然后利用协议扩展提供默认的实现。
下面将以代码的形式来突出方案 3 的优越性
方案 2的代码,采用继承
//
// Person.swift
// pop_demo1
//
// Created by liuyaozong on 2022/1/26.
//
import UIKit
class Person: NSObject {
var name: String {
return "张三"
}
func eat() {
print("吃饭了")
}
func study() {
print("学习了")
}
}
//舞者
class Dancers: Person {
//跳舞了
func dancing() {
print("我要跳舞")
}
}
class Student: Person {
override var name: String {
return "我是学生"
}
override func eat() {
print("学生吃饭了")
}
}
请阅读上面的代码. 如果此时学生 想跳舞了,怎么办? 很显然继承无法解决这个问题. 我们只能对学生类进行扩展.
你可能会想 为什么不直接写在基类. 当然写在基类是可以解决问题. 但是最好的方案是针对不同的人有不同的能力. 而不是所有的人都具备所有的能力. 狗也要吃饭, 狗继承于人类...不太友好. 希望: 当我们需要为它增加能力的时候能很容易的进行添加,不影响,不耦合其他类.
那么 swift 协议+扩展方案就很能体现其优越性了
//
// PersonProctol.swift
// pop_demo1
//
// Created by liuyaozong on 2022/1/26.
//
import UIKit
///吃饭协议
public protocol EatProtcol {}
///跳舞协议
public protocol DancingProtcol {}
///学习协议
public protocol StudyProtcol {}
//吃饭扩展
extension EatProtcol where Self: NSObject {
func eat() {
print("吃饭了")
}
}
//跳舞扩展
extension DancingProtcol where Self: NSObject {
func dancing() {
print("跳舞了")
}
}
//学习扩展
extension StudyProtcol where Self: NSObject {
func study() {
print("学习了")
}
}
//如果我们需要所有的集成 NSObject 的都有学习功能
extension NSObject: StudyProtcol {}
import UIKit
//干饭人
class Person: NSObject,EatProtcol {
override init() {
super.init()
//我吃饭了
self.eat()
//我学习
self.study()
}
}
//舞者
class Dancers: NSObject,DancingProtcol {
override init() {
super.init()
//我吃饭了
self.dancing()
//我学习
self.study()
}
}
//学生
class Student: NSObject {
override init() {
super.init()
//我要学习
self.study()
}
}
上面的代码可以看出来. 干饭人 具备了吃饭能力, 跳舞的人具备了跳舞的能力.需要什么能力就遵循什么协议. 所有的人具备了学习能力.
swift 跟 OC 的协议有个最大的区别是, swift 的协议可以利用扩展来实现方法. 而不用 在每个类里面单独进行实现. 但是 OC 办不到.