protocolFullyNamed{var fullName:String{get}}structPerson:FullyNamed{var fullName:String}let john =Person(fullName:"John")classStarShip:FullyNamed{varprefix:String?var name:Stringinit(name:String,prefix:String?=nil){self.name = name
self.prefix=prefix}var fullName:String{// StarShip 类遵循了 FullyNamed 协议,必须要实现协议中属性的可读属性return(prefix!=nil?prefix!+" ":"")+ name
}}var sta =StarShip(name:"EnterPrice",prefix:"USS")print(sta.name)print(sta.fullName)print(sta.prefix??"")
在协议中定义类型属性时在前面添加 static 关键字。当类的实现使用 class 或 static 关键字前缀声明类型属性要求时,这个规则仍然适用。
protocolTcpProtocol{init(no1:Int)funcadd(count:Int)}classMainClass{var no1:Int//局部变量init(no1:Int){self.no1 = no1 //初始化}}classSubClass:MainClass,TcpProtocol{funcadd(count:Int){print("lalallal")}var no2:Intinit(no1:Int, no2:Int){self.no2 = no2
super.init(no1: no1)}// 因为遵循协议,需要加上"required"; 因为继承自父类,需要加上"override"requiredoverrideconvenienceinit(no1:Int){//便利构造函数 先调用本类的指定初始化器self.init(no1: no1, no2:0)}}let res =MainClass(no1:10)let show =SubClass(no1:20, no2:30)print("res is: \(res.no1)")// 10print("res is: \(show.no1)")// 20print("res is: \(show.no2)")// 30
将协议作为类型
在函数、方法或者初始化器里作为形式参数类型或者返回类型;
作为常量、变量或者属性的类型;
作为数组、字典或者其他存储器的元素的类型。
//协议类型protocolGenerator{associatedtype member
funcnext()-> member?}var items =[10,20,30].makeIterator()whilelet x = items.next(){print(x)}/** 输出:
10
20
30
*/for list in[1,2,3].map({ i in i *5}){print(list)}/**
输出:
5
10
15
*/
protocol tcpProtocol {init(no1:Int)}classMainClass{var no1:Intinit(no1:Int){self.no1 = no1
}}classSubClass:MainClass, tcpProtocol {var no2:Intinit(no1:Int, no2:Int){self.no2 = no2
super.init(no1: no1)//调用父类的指定初始化器}// 因为遵循协议,需要加上"required"; 因为继承自父类,需要加上"override"requiredoverrideconvenienceinit(no1:Int){self.init(no1: no1, no2:0)//便捷初始化器需要先调用本类的指定初始化器}}let res =MainClass(no1:20)let show =SubClass(no1:30, no2:50)print("res is: \(res.no1)")print("res is: \(show.no1)")print("res is: \(show.no2)")/**
res is: 20
res is: 30
res is: 50
*/
//协议组合protocolNamed{var name:String{get}}protocolAged{var age:Int{get}}structPerson:Named,Aged{var name:Stringvar age:Int}funcWishHappyBirthday(to celebrator:Named&Aged){//使用 & 符号连接多个协议print("Happy birthday! \(celebrator.name), you are \(celebrator.age)")}let person =Person(name:"zhangsan", age:14)WishHappyBirthday(to: person)// 打印: Happy birthday, zhangsan, you are 14