iOS 面向协议的Swift

面向协议

简单来说,协议就是一张代码实现蓝图,我们可以在这张蓝图上勾勒出可能需要实现的方法、属性和其他满足特定任务的功能模块。而类、结构或枚举都可以通过这张蓝图(协议)来提供对这些需求的实际实现。而任何满足协议要求的类型都被认为符合该协议,都需要实现该协议规定必须实现的方法和属性。

Swift 标准库核心是面向协议,连一些函数响应式编程框架,像RXSwift,ReactorKit核心也是面向协议的编程。
利弊:

  1. 可以继承多个协议,弥补 swift 中类单继承的不足
  2. 增强代码的可扩展性,减少代码的冗余
  3. 让项目更加组件化,代码可读性更高
  4. 让无需的功能代码组成一个功能块,更便于单元测试。

应用场景:

当类是一个超类时,它会过于复杂,让类极度臃肿,有时候会让一些应用场合极低、无关的属性放到了一起,而且,你在每次初始化该类的时候都需要初始化这些属性。去初始化一个极重的类的一些不必要的属性,无疑是不符合我们的要求的。
Swift语法:
使用protocol声明方法,然后使用extension提供默认的实现,只要需要使用到该方法的类遵循该protocol,就可以直接使用该extension的实现。

// An highlighted block
文件:SomeProtocol.swift
var foo = 'bar';
Protocol SomeProtocol {
	var name: String {get}
}
extension SomeProtocol {
	func action() {
     	print("action is \(name)")
    }
}
struct Demo1: SomeProtocol {
    
    var name: String = "mouse"
}

struct Demo1:SomeProtocol {
    var name: String = "cat"
}

let demo1 = Demo1()
let demo2 = Demo2()
cat.action()
dog.action()

print结果:
action is mouse
faction is cat

为什么说Swift是面向协议编程的语言?

因为Swift里更推荐使用值类型变量(struct)而不是引用类型(class)的变量,Swift中许多常见的数据类型、字符串、集合类型,以及结构体和枚举都是值类型而非引用类型,值类型的变量在赋值时会自动进行一次低消耗的值拷贝,对比对象的copy要更加高效而且不存在线程安全问题。

为什么需要struct,以及struct和class的主要区别:

  1. struct是值引用,而class是类型引用
  2. struct没有继承的功能,class有继承功能

首先说第一点区别,从swift 的更新和struct不断完善来看,苹果公司更加推荐使用struct来代替class,因为struct值引用和class类型引用这点区别,保证使用struct编码能写出更加安全可靠的代码。为什么这样说呢,class类型引用在赋值时是将变量指向了同一块内存地址,这在一个长时间的跨度上会带来一些意想不到的问题,试想一个简单的例子,viewControllerA持有一个NSMutableArray数组mutalbeArray,它包含100条user信息,此时将mutableArray赋值给viewControllerB,对于viewControllerB而言,它仅仅需要前10条user信息,所以它将mutableArray多余的信息删除了,这样一个脑残的操作导致了viewControllerA模块展示错误和潜在的逻辑错误。而使用struct值引用则不会出现这样的问题。
第二点区别,struct没有继承的功能,这是因为swift在本质上来说是面向协议 (Protocol Oriented) 的语言,struct没有也不需要继承的功能,为了实现某个功能,struct去服从并实现某个协议就即可,从一个较高的层次来看,struct+protocol是构成swift面向协议语言的两个基石。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值