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读取一个目录下所有目录和文件的方法
Jul 15 Python
Python 爬虫学习笔记之正则表达式
Sep 21 Python
django批量导入xml数据
Oct 16 Python
Python分治法定义与应用实例详解
Jul 28 Python
微信跳一跳游戏python脚本
Apr 01 Python
Python中property属性实例解析
Feb 10 Python
Python二进制串转换为通用字符串的方法
Jul 23 Python
Python实现获取系统临时目录及临时文件的方法示例
Jun 26 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
django-crontab实现服务端的定时任务的示例代码
Feb 17 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
浅析Python模块之间的相互引用问题
Feb 26 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
php继承中方法重载(覆盖)的应用场合
2015/02/09 PHP
Codeigniter控制器controller继承问题实例分析
2016/01/19 PHP
PHP程序员简单的开展服务治理架构操作详解(三)
2020/05/14 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
Jquery知识点二 jquery下对数组的操作
2011/01/15 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
JavaScript函数定义的常见注意事项小结
2014/09/16 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
JS实现回到页面顶部动画效果的简单实例
2016/05/24 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
细数JavaScript 一个等号,两个等号,三个等号的区别
2016/10/09 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
2017/03/21 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
Vue.js数据绑定之data属性
2017/07/07 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
node.js使用express框架进行文件上传详解
2019/03/03 Javascript
layui动态渲染生成左侧3级菜单的方法(根据后台返回数据)
2019/09/23 Javascript
jQuery实现轮播图源码
2019/10/23 jQuery
微信小程序语音同步智能识别的实现案例代码解析
2020/05/29 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python抓取最新博客内容并生成Rss
2015/05/17 Python
用python写的一个wordpress的采集程序
2016/02/27 Python
在centos7中分布式部署pyspider
2017/05/03 Python
python删除某个字符
2018/03/19 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
2019/11/04 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
python 代码运行时间获取方式详解
2020/09/18 Python
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
平安家庭事迹材料
2014/12/20 职场文书
总经理年会致辞
2015/07/29 职场文书
python实现股票历史数据可视化分析案例
2021/06/10 Python