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中处理时间之clock()方法的使用
May 22 Python
基于python脚本实现软件的注册功能(机器码+注册码机制)
Oct 09 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
Pycharm学习教程(5) Python快捷键相关设置
May 03 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
django实现模型字段动态choice的操作
Apr 01 Python
python使用opencv resize图像不进行插值的操作
Jul 05 Python
Python 实现 T00ls 自动签到脚本代码(邮件+钉钉通知)
Jul 06 Python
python 贪心算法的实现
Sep 18 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
Apr 14 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新手上路(八)
2006/10/09 PHP
PHP 中关于ord($str)>0x80的详细说明
2012/09/23 PHP
PHP常用技术文之文件操作和目录操作总结
2014/09/27 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
用javascript实现兼容IE7的类库 IE7_0_9.zip提供下载
2007/08/08 Javascript
通用javascript脚本函数库 方便开发
2009/10/13 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
省市区三级联动下拉框菜单javascript版
2015/08/11 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
JS实现上传图片的三种方法并实现预览图片功能
2017/07/14 Javascript
微信小程序视图控件与bindtap之间的问题的解决
2019/04/08 Javascript
微信小程序-form表单提交代码实例
2019/04/29 Javascript
VUE的history模式下除了index外其他路由404报错解决办法
2019/08/21 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
python 简单搭建阻塞式单进程,多进程,多线程服务的实例
2017/11/01 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
PyTorch: 梯度下降及反向传播的实例详解
2019/08/20 Python
python的slice notation的特殊用法详解
2019/12/27 Python
基于Django signals 信号作用及用法详解
2020/03/28 Python
分享unittest单元测试框架中几种常用的用例加载方法
2020/12/02 Python
使用CSS3中的calc()属性来以算式表达尺寸数值
2016/06/06 HTML / CSS
Marc Jacobs彩妆官网:Marc Jacobs Beauty
2017/07/03 全球购物
介绍一下游标
2012/01/10 面试题
主题团日活动总结
2014/06/25 职场文书
个人工作表现自我评价
2015/03/06 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
驳回起诉裁定书
2015/05/19 职场文书
员工担保书范本
2015/09/22 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书
2016年“6.26”禁毒宣传月系列活动总结
2016/04/05 职场文书
Django drf请求模块源码解析
2021/06/08 Python
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server
python使用BeautifulSoup 解析HTML
2022/04/24 Python
nginx lua 操作 mysql
2022/05/15 Servers