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 正则式使用心得
May 07 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
python3+PyQt5+Qt Designer实现扩展对话框
Apr 20 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
python之当你发现QTimer不能用时的解决方法
Jun 21 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
python2 对excel表格操作完整示例
Feb 23 Python
Python递归函数特点及原理解析
Mar 04 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
Apr 08 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
python实现一次性封装多条sql语句(begin end)
Jun 06 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 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
社区(php&&mysql)一
2006/10/09 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
2011/02/18 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
nodejs+express实现文件上传下载管理网站
2017/03/15 NodeJs
浅谈vuepress 踩坑记
2018/04/18 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
2020/07/20 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
Python实现删除文件中含“指定内容”的行示例
2017/06/09 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
2018/02/13 Python
Django中的forms组件实例详解
2018/11/08 Python
Django集成CAS单点登录的方法示例
2019/06/10 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
利用python制作拼图小游戏的全过程
2020/12/04 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
Big Green Smile德国网上商店:提供各种天然产品
2018/05/23 全球购物
四好少年事迹材料
2014/01/12 职场文书
消防安全检查制度
2014/02/04 职场文书
集团公司党的群众路线教育实践活动工作总结
2014/03/03 职场文书
银行进社区活动总结
2014/07/07 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
超市采购员岗位职责
2015/04/07 职场文书
2015年除四害工作总结
2015/07/23 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
MySQL中连接查询和子查询的问题
2021/09/04 MySQL
海弦WR-800F
2022/04/05 无线电
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android