swift-面向协议编程

871 阅读2分钟

Siwft为什么是面向协议编程

面向协议编程 (Protocol Oriented Programming) 是 Apple 在 2015 年 WWDC 上提出的 Swift 的一种编程范式。

面向协议编程通过字面意思,我们可能觉得面向协议编程都是和协议相关的,其实这个假定可能是错误的,面向协议编程与面向对象编程一样,是一种新的编写程序的方式,不仅仅和协议相关。

protocol - 基本用法

协议定义:

protocol 协议名称 {
    // 定义协议内容
}

声明协议:

class  类名 : 父类 {
      var delegate:协议名称? = nil;
}

遵循协议:

class 实现协议类名: 父类 {
     // 创建一个类
        let 类名 = 类名()
        类名.delegate = self
}

extension 实现协议类名:协议名 {
   // 实现协议内容
}

protocol协议,就是a类不想自己完成协议内容,可以指定实现协议类来帮忙实现

我们可以用一个现实例子来实现,现有客户Person_A,需要完成打扫房间和做饭的这两个功能,客户这时候并不想自己完成这些,这时候需要家政Person_B来完成

/// 定义家政协议
protocol Housekeeping {
    /// 协议内容-打扫房间
    func cleanHome()
    /// 协议内容-做饭
    func doCooking()
}

/// 创建客户A
class Person_A : NSObject {
    /// 声明协议
    var delegate:Housekeeping? = nil;
    /// 打扫房间
    func cleanHome() {
        delegate?.cleanHome()
    }
    /// 做饭
    func doCooking() {
        delegate?.doCooking()
    }
}
// 这时候客户提出需求,我们需要构建一个家政B来实现协议内容
class Person_B : NSObject {
    
}
/// 实现协议
extension Person_B:Housekeeping {
    func cleanHome() {
        print("家政-清扫完成了")
    }
    
    func doCooking() {
        print("家政-饭做好了")
    }
}
/// 创建客户
let person_A = Person_A()
let person_B = Person_B()
person_A.delegate = person_B
person_A.cleanHome() // 家政-清扫完成了
person_A.doCooking() // 家政-饭做好了

Struct的优势

我们一直会说OC是面向对象语言我们在开发的时候会使用Class来解决许多问题,对于swift来说,更推荐我们使用struct

Class类是引用类型,可以继承

Struct是值类型,不能继承

swift中我们常用的数据类型,字符串,集合类型,结构体和枚举都是值类型,我们在赋值的时候相比class更加高效且不存在线程安全。

为何swift更适用面向协议编程

struct没有继承的功能,这是因为swift在本质上来说是面向协议 (Protocol Oriented) 的语言,struct没有也不需要继承的功能,为了实现某个功能,struct去服从并实现某个协议就即可,从一个较高的层次来看,struct+protocol是构成swift面向协议语言的两个基石