协议约定了一些属性与方法,其做用相似Java中的抽象类,Swift中类型经过遵照协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议能够经过扩展来实现一些方法和附加功能。javascript
协议中定义的属性只约定名称和类型,在具体类型的实现中,其能够是存储属性也能够是计算属性,协议中还须要指定属性是可读的仍是可读可写的。示例代码以下:java
protocol MyPortocol { //定义实例属性 //可读的 var name:String{get} //可读可写的 var age:Int{set get} //可读的 var nameAndAge:String{get} static var className:String{get} } class MyClass: MyPortocol { var name: String var age: Int var nameAndAge: String{ get{ return "\(name)"+"\(age)" } } static var className: String{ get{ return "MyClass" } } init(){ name = "HS" age = 24 } }
有一点须要注意,协议中的可读并非只读,协议中的属性约定成可读可写,则在实现时,这个属性必须是可读可写的,可是若是协议中约定成可读的,则此属性能够是只读的也能够是可读可写的,看具体的实现。函数
协议中约定的方法能够是实例方法也能够是类型方法,示例以下:spa
protocol MyPortocol { func logName() static func logClassName() } class MyClass: MyPortocol { var name: String var age: Int init(){ name = "HS" age = 24 } func logName() { print(name) } static func logClassName() { print(className) } }
一样,协议中也能够对构造方法进行定义约定。code
协议中虽然没有任何属性和方法的实现,可是其仍然能够当作类型来使用,在函数参数、返回值中应用普遍,示例以下:继承
protocol MyPortocol { //定义实例属性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } //将协议类型做为参数 func test(param:MyPortocol) { param.logName() }
协议做为类型这种用法另外一个应用点是在集合类型中,协议能够做为全部遵照此协议的集合类型。ip
协议能够像其余类型同样进行继承,子协议将自动拥有父协议约定的属性和方法。协议也能够经过class关键字来定义只有类能够进行遵照,示例以下:get
protocol MyPortocol { //定义实例属性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } //只有类能够继承此协议 protocol MySubPortocol:class,MyPortocol { }
协议既然能够像其余类型同样进行使用,固然它也可使用is,as?,as!进行检查和转换,关于is,as的更多用法能够查看Swift关于类型转换的内容。it
协议也可定义其中的属性或方法为可选的,即遵照此协议的类能够实现也能够不实现可选的属性和方法,然而,声明为可选的须要此协议为@objc类型的,示例以下:io
@objc protocol MyPortocol { //定义实例属性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() //可选实现 optional static func logClassName() }
Swift中的协议还有一个十分重要的特性,其能够经过扩展来进行属性、方法以及下标的实现。这对于一些通用类的方法十分方便,这至关于全部继承此协议的类都默认实现了这样的方法,示例以下:
protocol MyPortocol { //定义实例属性 var name:String{get} var age:Int{set get} var nameAndAge:String{get} static var className:String{get} func logName() static func logClassName() } extension MyPortocol{ var name:String{ return "HS" } }
专一技术,热爱生活,交流技术,也作朋友。
——珲少 QQ群:203317592