Swift中的协议(protocol)学习教程


Posted in Python onJuly 08, 2016

一、引言

协议约定了一些属性与方法,其作用类似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"
  }
}
Python 相关文章推荐
python学习手册中的python多态示例代码
Jan 21 Python
Python线程中对join方法的运用的教程
Apr 09 Python
深入解析Python中的urllib2模块
Nov 13 Python
python进阶_浅谈面向对象进阶
Aug 17 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
python-str,list,set间的转换实例
Jun 27 Python
Python Flask 搭建微信小程序后台详解
May 06 Python
Python利用sqlacodegen自动生成ORM实体类示例
Jun 04 Python
python 列表输出重复值以及对应的角标方法
Jun 11 Python
python随机生成大小写字母数字混合密码(仅20行代码)
Feb 01 Python
Python 解决相对路径问题:"No such file or directory"
Jun 05 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 06 Python
Python中多线程的创建及基本调用方法
Jul 08 #Python
使用PyInstaller将Python程序文件转换为可执行程序文件
Jul 08 #Python
Python遍历目录中的所有文件的方法
Jul 08 #Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 #Python
使用Python读写及压缩和解压缩文件的示例
Jul 08 #Python
Python中的FTP通信模块ftplib的用法整理
Jul 08 #Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 #Python
You might like
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
JS小功能(列表页面隔行变色)简单实现
2013/11/28 Javascript
JS获取select的value和text值的简单实例
2014/02/26 Javascript
js分页代码分享
2014/04/28 Javascript
js 获取浏览器版本以此来调整CSS的样式
2014/06/03 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成"...")
2016/11/28 Javascript
Vuejs 组件——props数据传递的实例代码
2017/03/07 Javascript
解析Angular 2+ 样式绑定方式
2018/01/15 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
在vue中给列表中的奇数行添加class的实现方法
2018/09/05 Javascript
解决vue同一slot在组件中渲染多次的问题
2018/09/06 Javascript
详解如何在vscode里面调试js和node.js的方法步骤
2018/12/24 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
Vue作用域插槽实现方法及作用详解
2020/07/08 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
[01:03:27]Optic vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
400多行Python代码实现了一个FTP服务器
2012/05/10 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
利用 Monkey 命令操作屏幕快速滑动
2016/12/07 Python
python如何重载模块实例解析
2018/01/25 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
Python OpenCV处理图像之图像直方图和反向投影
2018/07/10 Python
由Python编写的MySQL管理工具代码实例
2019/04/09 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
2019/11/11 Python
Python获取对象属性的几种方式小结
2020/03/12 Python
django中ImageField的使用详解
2020/12/21 Python
乌克兰巴士票购买网站:inBus
2021/03/12 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
文职个人求职信范文
2013/09/23 职场文书
七匹狼男装广告词
2014/03/21 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记