1、协议,抽象类,java中的接口,只规定方法名、参数列表、返回值,不给出具体的实现。
类、结构体、枚举,都可以声明遵从一个或多个协议,并提供该协议所要求的属性和方法的具体实现。
2、定义协议
protocol 协议名 {
//协议内容
}
3、遵从协议
类型(类、结构体、枚举) 类型名 :父类, 协议1,协议2 {
//遵从协议内容
}
如果一个类继承父类的同时,也遵从协议,父类必须放在最前面
4、协议可以要求遵从这,提供实例属性、静态属性、实例方法、静态方法
4.1 实例方法
protocolFigure {
funconDraw()
}
classRectangle :Figure{
funconDraw() {
print("绘制矩形...")
}
}
letrect1 =Rectangle()
rect1.onDraw()
4.2静态方法
方法前加ststic,结构体、枚举要用static,类要用class或static,class可以被子类继承
protocolAccount {
staticfuncinterestBy(amount:Double) ->Double
}
classClassImp :Account{
classfuncinterestBy(amount:Double) ->Double{
return0.0668* amount
}
}
4.3可变方法
由于结构体、枚举不能修改属性,需要用mutating来定义可变方法
5、协议属性,无论是存储属性还是计算属性,只要满足协议就可以
5.1协议实例属性
protocolPerson {
varfirstName :String{getset}可读写
varlastName :String{getset}
varfullName :String{get}只读
}
5.2协议静态属性
属性前面加static,结构体、枚举要用static,类要用class或static
6、面向协议编程
能够是面向对象类型的定义与实现分离,协议作为数据类型暴露给使用者,使其不关系具体的实现细节,从而提供代码的可扩展性和可复用性
协议类型:协议可以出现在任意允许其他数据类型出现的地方
作为函数、方法、构造函数中的参数类型、返回值类型
作为常量、变量、属性的类型
作为数组、字典、Set的元素类型
协议作为类型使用,不仅可以用as、as?、as!进行类型转换,还能用is判断是否遵从了某个协议
7、协议的继承:一个协议可以集成若干个协议,并可以在继承基础上增加新需求,可以多重继承,class不能多重继承
协议的扩展:协议扩展,本质上还是协议,增加了一些方法和属性
协议的组合:协议1 & 协议2... 临时的类型,要求参数同事遵从协议1和协议2
扩展中遵从协议:struct A extension A :协议1