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面向协议语言的两个基石
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END