1. 协议的概念:
1) 其实就是Java中的接口,Swift的遵守协议就是Java中的实现接口,如果放在C++中就是纯虚类的概念,即协议就是一种高度抽象的抽象类,里面值规定了方法、属性等内容,但没有提供任何实现,所有遵守该协议的类、结构体或枚举都必须实现协议中规定的内容,只不过C++没有接口而只能通过继承虚基类来实现其中的内容而已;
2) 协议是面向接口编程的必不可少的机制,其要求定义与实现分离,在Java和Swift中都可以将协议作为数据类型(就和其它普通的数据类型Int、Array等)暴露给使用者,而使用者不用关心具体的实现细节;
其实这也是通过协议实现多态的一种方式,即用一个协议类型的引用指向实现该协议的实例,通过该引用调用协议中要求的方法等便能实现多态,并且可以使用is、as等操作符进行向下转换!
3) 协议的定义和遵守:
protocol 协议名 { // 协议的定义
协议的内容
}
类型 类型名: 协议1, 协议2... { // 遵守协议
实现协议中的内容
}
类类型 类类型名: 父类名, 协议1, 协议2... { // 类在继承的同时遵守协议
相关内容
}
可见比Java接口的语法还要简洁很多!
4) 协议可以作用的对象:包括类、结构体和枚举;
5) 协议中可以定义的内容:计算属性(实例/静态)、方法(实例/静态)和下标;
2. 协议属性:
1) 只能在协议中定义计算属性,但是遵守协议的时候却可以实现成存储属性!这是因为只要实现协议要求的就行了,也就是说协议只规定遵守者必须做的事却并没有规定遵守者不能做的事,请看下例:
protocol A {
var a: Int { get set } // 定义一个可读可写的计算属性
class var b: Int { get } // 不管遵守者是引用型的还是值类型的静态属性都是用class修饰!
}
class B: A {
var a = 20 // 虽然a不是计算属性,但a同样是可读可写的!因此没问题!
class var b: Int {
get {
return 10
}
set { // 虽然协议规定b是只读的,但只要遵守实现只读就行了,可写并没有规定,因此可以定义!
println("haha")
}
}
}
enum C: A {
var a: Int { // 由于枚举不能定义实例存储属性,所以必须实现getter和setter
get {
return 10
}
set {
println("haha")
}
}
static var b: Int { // 结构体和枚举实现静态属性要使用static!不管协议中使用class定义的!
return 99
}
}
由上例可见,协议中只能提供抽象接口而不能定义这些功能的具体实现,具体实现由遵守协议者实现,并且协议中所有内容都必须实现,少一个都会报错!
为体现抽象性,只写get或set,两者都有则中间用空格隔开即可,这就表示遵