協(xié)議可以用來定義方法孩哑、屬性、下標的聲明翠桦,協(xié)議可以被枚舉横蜒、結(jié)構(gòu)體、類遵守
protocol Test {}
protocol Test1 {
func run()
}
protocol Test2 {}
class TestClass : Test,Test1,Test2 {
func run() {}
}
一销凑、屬性
protocol Test {
var age : Int {set get}
var name : String {get}
var height : Int {set get}
}
class TestClass : Test {
var age: Int {
set {}
get {20}
}
var name: String {
get {""}
}
var height:Int = 20
}
- 1丛晌、協(xié)議中定義屬性時必須用var關(guān)鍵字,通過在后面聲明set斗幼、get來告訴該屬性是可讀還是可寫澎蛛。
- 2、協(xié)議屬性可以通過存儲屬性或者計算屬性來實現(xiàn)蜕窿。
二谋逻、class和static
protocol Test {
static func test()
static var age : Int{set get }
}
class TestClass : Test {
static var age: Int = 20
class func test() {
print("測試")
}
}
- 為了保證通用,協(xié)議中必須用static定義類型方法渠羞、類型屬性斤贰、類型下標
三、init
協(xié)議中還可以定義初始化器
protocol Test {
init(x:Int, y:Int)
}
final class Student : Test {
init(x: Int, y: Int) {
}
class Person: Test {
required init(x: Int, y: Int) {
}
}
}
- 非final類實現(xiàn)協(xié)議的初始化方法時必須加上 required
四次询、協(xié)議的繼承
protocol Liveable {
func run()
}
protocol Runalbe :Liveable{}
class Student : Runalbe{
func run() {}
}
一個協(xié)議可以繼承其它協(xié)議
五荧恍、協(xié)議的組合
協(xié)議組合,可以包含1個類類型(最多一個)
protocol Liveable {}
protocol Runalbe{}
class Person : Liveable,Runalbe {}
//接收Person或者其子類的是實例
func fn0(obj:Person){}
//接收遵守Liveable協(xié)議的實例
func fn1(obj:Liveable){}
//接收遵守Liveable、Runnable協(xié)議的實例
func fn2(obj:Liveable & Runalbe ){}
//接收遵守Liveable屯吊、Runnable協(xié)議的實例
func fn3(obj:Person & Liveable & Runalbe ){}
六送巡、常用協(xié)議
6.1、CaseIterable
讓枚舉遵守Caseiterable協(xié)議盒卸,可以實現(xiàn)遍歷枚舉
enum Season : CaseIterable {
case spring,summer,autumn,winter
}
let seasons = Season.allCases
for season in seasons {
print(season)
}
6.2骗爆、 Equatable
對象遵守Equatable協(xié)議,可以使對象通過==運算符進行比較
class Student : Equatable {
static func == (lhs: Student, rhs: Student) -> Bool {
return lhs.age == rhs.age
}
var age : Int = 0
var name :String = ""
}
let s1 = Student()
s1.age = 20
s1.name = "jack"
let s2 = Student()
s2.age = 20
s2.name = "john"
if s1 == s2 {
print("我們都一樣")
}else{
print("我們不一樣")
}