美文网首页
swift pop 面向协议开发

swift pop 面向协议开发

作者: iOS刘耀宗 | 来源:发表于2022-01-26 16:02 被阅读0次

尽管编程语言不一样,但是编程的思想都是互通的!
我们都知道 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 办不到.

相关文章

网友评论

      本文标题:swift pop 面向协议开发

      本文链接:https://www.haomeiwen.com/subject/hwsnhrtx.html