- 协议(
protocol
)
协议规定了用来实现某一特定功能所必需的方法和属性。
任意能够满足协议要求的类型被称为遵循(conform
)这个协议。
类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。
协议可以照
Java
中的接口
来理解
- 属性定义要求
1、不能用默认值
2、必须指明类型:{ set get }
来表示属性是可读可写的,可读属性则用{ get }
3、必须用var
修饰
- 方法定义要求
1、方法不能有方法体
2、方法不可以有默认值
- 声明一个协议
protocol Identifiable {
var Id: String{get set}
func DisplayID()
}
- 实现协议中的属性
1、属性可以设置默认值
2、协议中属性为可读可写,必须声明为var
3、协议中属性为可读的,实现中可以声明let或者var
- 遵循协议
struct User: Identifiable{
var Id: String
func DisplayID(){
print("The Id is \(Id)")
}
}
var user = User(Id: "2116110250")
user.DisplayID()
- 案例:代理模式
protocol ChongLang{
func Function()
}
class UWIFI:ChongLang{
func Function() {
print("我用Wi-Fi上网冲浪。")
}
}
class UKuanDai: ChongLang {
func Function() {
print("路由器坏了,只能连接宽带上网冲浪。")
}
}
class ZhaiNan{
var shangwang:ChongLang
init(shangwang:ChongLang){
self.shangwang = shangwang
}
func Happy(){
shangwang.Function()
print("终于可以上网了,我要看一切东西,美滋滋。")
}
}
var zhainan = ZhaiNan(shangwang: UWIFI())
zhainan.Happy()
- 扩展
扩展允许将方法添加到现有类型中,以使它们执行原本没有设计要执行的操作。
关键字:extension
extension Array {
func GetMax(array:Array<Int>) -> Int{
var maxValue = array[0]
for index in 1..<array.count{
if maxValue < array[index] {
maxValue = array[index]
}
}
return maxValue
}
}
var testArray = [23,4,67,1,0,-3,192,34]
print(testArray.GetMax(array: testArray))
- 扩展协议
关键字:
extension
extension Collection {
func summarize() {
print("There are \(count) of us:")
for name in self {
print(name , terminator:" ")
}
}
}
testArray.summarize()
- 面向协议编程
protocol myIdentifiable {
var Id: String{get set}
}
extension myIdentifiable {
func Identify(){
print("My Id is \(Id)")
}
}
class Doctor: myIdentifiable {
var Id: String
init(Id: String){
self.Id = Id
}
}
var doctor = Doctor(Id:"aa123")
doctor.Identify()
- 总结
- 协议描述了采用的类型必须具有的方法和属性,但未提供这些方法的实现。
- 您可以在其他协议的基础之上构建协议,类似于类。
- 扩展使您可以向特定类型(例如Int)添加方法和计算属性。
- 协议扩展使您可以向协议添加方法和计算属性。
- 面向协议编程是一种将应用程序体系结构设计为一系列协议,然后使用协议扩展来提供默认方法实现的实践。