视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Swift中的协议(protocol)学习教程
2020-11-27 14:29:08 责编:小采
文档

一、引言

协议约定了一些属性与方法,其作用类似Java中的抽象类,Swift中类型通过遵守协议来实现一些约定的属性和方法。Swift中的协议使用protocol关键字来声明。Swift中的协议还有一个十分有意思的特性,协议可以通过扩展来实现一些方法和附加功能。

二、在协议中定义属性和方法

协议中定义的属性只约定名称和类型,在具体类型的实现中,其可以是存储属性也可以是计算属性,协议中还需要指定属性是可读的还是可读可写的。示例代码如下:

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
 }
}

有一点需要注意,协议中的可读并不是只读,协议中的属性约定成可读可写,则在实现时,这个属性必须是可读可写的,但是如果协议中约定成可读的,则此属性可以是只读的也可以是可读可写的,看具体的实现。

协议中约定的方法可以是实例方法也可以是类型方法,示例如下:

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)
 }
}

同样,协议中也可以对构造方法进行定义约定。

三、协议的特点

协议中虽然没有任何属性和方法的实现,但是其仍然可以当做类型来使用,在函数参数、返回值中应用广泛,示例如下:

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()
}

协议作为类型这种用法另一个应用点是在集合类型中,协议可以作为所有遵守此协议的集合类型。

协议可以像其他类型一样进行继承,子协议将自动拥有父协议约定的属性和方法。协议也可以通过class关键字来定义只有类可以进行遵守,示例如下:

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关于类型转换的内容。

协议也可定义其中的属性或方法为可选的,即遵守此协议的类可以实现也可以不实现可选的属性和方法,然而,声明为可选的需要此协议为@objc类型的,示例如下:

@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"
 }
}

下载本文
显示全文
专题