Swift专题讲解二十一——协议

Swift专题讲解二十一——协议

一、引言

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

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

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

1protocol MyPortocol { 2 //定义实例属性 3 //可读的 4 var name:String{get} 5 //可读可写的 6 var age:Int{set get} 7 //可读的 8 var nameAndAge:String{get} 9 static var className:String{get} 10} 11class MyClass: MyPortocol { 12 var name: String 13 var age: Int 14 var nameAndAge: String{ 15 get{ 16 return "\(name)"+"\(age)" 17 } 18 } 19 static var className: String{ 20 get{ 21 return "MyClass" 22 } 23 } 24 init(){ 25 name = "HS" 26 age = 24 27 } 28}

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

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

1protocol MyPortocol { 2 func logName() 3 static func logClassName() 4} 5class MyClass: MyPortocol { 6 var name: String 7 var age: Int 8 init(){ 9 name = "HS" 10 age = 24 11 } 12 func logName() { 13 print(name) 14 } 15 static func logClassName() { 16 print(className) 17 } 18}

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

三、协议的特点

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

1protocol MyPortocol { 2 //定义实例属性 3 var name:String{get} 4 var age:Int{set get} 5 var nameAndAge:String{get} 6 static var className:String{get} 7 func logName() 8 static func logClassName() 9} 10//将协议类型作为参数 11func test(param:MyPortocol) { 12 param.logName() 13}

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

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

1protocol MyPortocol { 2 //定义实例属性 3 var name:String{get} 4 var age:Int{set get} 5 var nameAndAge:String{get} 6 static var className:String{get} 7 func logName() 8 static func logClassName() 9} 10//只有类可以继承此协议 11protocol MySubPortocol:class,MyPortocol { 12 13}

        协议既然可以像其他类型一样进行使用,当然它也可以使用is,as?,as!进行检查和转换,关于is,as的更多用法可以查看Swift关于类型转换的内容。

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

1@objc protocol MyPortocol { 2 //定义实例属性 3 var name:String{get} 4 var age:Int{set get} 5 var nameAndAge:String{get} 6 static var className:String{get} 7 func logName() 8 //可选实现 9 optional static func logClassName() 10}

        Swift中的协议还有一个十分重要的特性,其可以通过扩展来进行属性、方法以及下标的实现。这对于一些通用类的方法十分方便,这相当于所有继承此协议的类都默认实现了这样的方法,示例如下:

1protocol MyPortocol { 2 //定义实例属性 3 var name:String{get} 4 var age:Int{set get} 5 var nameAndAge:String{get} 6 static var className:String{get} 7 func logName() 8 static func logClassName() 9} 10extension MyPortocol{ 11 var name:String{ 12 return "HS" 13 } 14}

专注技术,热爱生活,交流技术,也做朋友。

——珲少 QQ群:203317592

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Swift 简介

Swift和ObjectiveC的主要区别1,编程范式Swift可以面向协议编程、函数式编程、面向对象编程。Swift语言引入了协议、协议的扩展、泛型等新特性,因此使用Swift语言可以很好地面向协议编程;Swift语言将函数和闭包提升为语言的一等公民,函数可以作为一个变量、可以作为其他函数的参数、作为其他函数的返回值等来传递,所以

Swift讲解专题七——函数

Swift讲解专题七——函数一、引言      函数是有特定功能的代码段,函数会有一个特定的名称调用时来使用。Swift提供了十分灵活的方式来创建与调用函数。事实上在Swift,每个函数都是一种类型,这种类型由参数和返回值来决定。Swift和ObjectiveC的一大区别就在于Swift中的函数可以进行嵌套

Swift讲解专题八——闭包

Swift讲解专题八——闭包一、引言      Swift中的闭包是有一定功能的代码块,这十分类似于ObjectiveC中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。二、从一个系统函数看闭包      Swift标准函数库中提供了一个sort排序函数,对

Swift解读专题四——字符串与字符

Swift解读专题四——字符串与字符一、引言      Swift中提供了String类型与Characters类型来处理字符串和字符数据,Swift中的String类型除了提供了许多方便开发者使用的方法外,还可以与Foundation框架的NSString类进行转换,使用起来十分方便。二