第2部分 故事的进阶要素 - 编程语言Swift的进阶部分
15 协议
15.1 概念通俗讲解
协议在现实世界中,我们可以理解为制作的标准。例如苹果公司生产手机,不过苹果公司自己并不生产手机的各个硬件,而是把每个硬件分派给各个工厂来制作,例如屏幕,电池,内存,处理器。如何让各个工厂制作完成后,能够组装成手机完全没问题,就需要苹果来执行标准了。例如电池的长宽高是多少,屏幕的厚度是多少。这些实际制定的标准在Swift语言中就是协议的概念。所以协议中一个非常重要的应用场景就是制定标准。
15.2 定义简洁介绍
定义协议使用protocol关键字。
protocol 协议名{
}
举例
//定义协议iPhoneScreen
protocol iPhoneScreen{
var width: Float {set get}
var weight: Float {get}
func make()
}
//定义协议iPhoneBattery
protocol iPhoneBattery{
var width: Float {get}
var weight: Float {set get}
func make()
}
//开始生产屏幕,按照iPhoneScreen的标准来做
class Screen: iPhoneScreen{
//屏幕的宽度
var width: Float = 40
//屏幕的重量
var weight: Float = 20
//屏幕的制作方法
func make() {
print("制作手机屏幕")
}
}
//开始生产电池,按照iPhoneBattery的标准来做
class Battery: iPhoneBattery{
//电池的宽度
var width: Float = 40
//电池的重量
var weight: Float = 20
//电池的制作方法
func make() {
print("制作手机电池")
}
}
15.3 我的经验总结
1). 协议里的属性不能是常量,必须是变量
2). 类继承协议后,必须把协议里的属性和方法具体实现出来,协议里如果想让某些属性或方法不必非在继承的类里具体实现可使用optional关键字。
举例
@objc protocol iPhoneMemory{
@objc optional var size: Float {get}
var weight: Float {set get}
func make()
@objc optional func check()
}
class Memory: iPhoneMemory{
var weight: Float = 15
func make() {
print("制作手机的内存")
}
//这里size的属性就不需要强制具体初始化
//这里check()的方法就不需要强制具体实现出来
}
注:如果想使用关键字optional,代码如上所示协议关键字protocol前和关键字optional前需要加关键字@objc。
3). 一个类可以继承多个协议。这和一个类只可以继承一个类不一样。
例如,一个手机屏幕的制作,我可以同时继承苹果的标准和华为的标准
protocol HuaweiScreen{
}
protocol AppleScreen{
}
class MakeScreen: AppleScreen, HuaweiScreen{
}
4). 协议也可以继承协议。例如小米的屏幕标准继承国际通用的屏幕标准
protocol DefalutScreen{
}
protocol miScreen: DefalutScreen{
}
注:本人水平和能力有限,如果哪些地方写错了,请大家给我反馈,我会及时修改。