Introducing Swift - Protocols

Introducing Swift - Protocols

本文主要记录在学习Swift中【协议】时的笔记。


协议语法

// 定义
protocol SomeProtocol {
    // something ... 
}

// 使用
class SomeClass: SomeSuperClass, SomeProtocol {
    // protocol implementation ...
}

属性要求

协议可以用于要求其遵循者必须具有某些属性,可以要求属性的读写权限,但是不会要求属性是存储型还是计算型。

通过class关键字要求一个类必须具有的实体,通过static关键字要求一个结构体或者枚举必须具有的实体。


方法要求

协议可以用于要求其遵循者必须实现某些实例方法和类方法。和类中定义方法不同的是,协议方法支持变长参数,不支持默认参数。

通过class关键字要求一个类必须具有的实体,通过static关键字要求一个结构体或者枚举必须具有的实体。

如果协议中声明的一个方法需要去改变类或者结构体或者枚举中的某一个属性,那么需要将其声明为mutating方法。用class实现协议中的mutating方法时,不用写mutating关键字;用结构体,枚举实现协议中的mutating方法时,必须写mutating关键字。


委托(代理)模式

委托是一种设计模式,它允许一个对象将某些特定的操作交由其代理来实现。我们通过协议来声明这些操作,然后由代理对象去实现这些操作。和OC不同的是,我们有了更优雅的写法:

delegate?.doSomething(param)

当delegate为空时,后边的语句会优雅的忽略~


在扩展中使用协议

extension SomeClass: SomeProtocol {
    // protocol implementation ...
}

如果一个类已经实现了某一个协议的方法,但是没有声明,我们也可以通过扩展来声明:

extension SomeClass: SomeProtocol {}

之所以要这样做,是因为即使类已经满足了协议所要求的属性和方法,但是类型也不会自动转变,如果不声明,这个类依旧不是一个遵循了特定协议的类。


协议的继承

协议支持多继承,类仅支持单继承。


协议一致性检验

  1. 使用is检查实例是否遵循了某个协议;
  2. 使用as?返回一个可选值,如果实例遵循了协议,返回协议类型,否则返回nil;
  3. 使用as用于强制向下换型。
  4. @objc用来表示协议是可选的(同时在相关方法和属性前面加上@optional关键字),也可以用于表示暴露给OC的代码,此外,@objc型协议只对类有效,因此只能在类中检查协议的一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值