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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
Python实现微信公众平台自定义菜单实例
Mar 20 Python
Python数组遍历的简单实现方法小结
Apr 27 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
Python facenet进行人脸识别测试过程解析
Aug 16 Python
python统计函数库scipy.stats的用法解析
Feb 25 Python
python中常见错误及解决方法
Jun 21 Python
Python map及filter函数使用方法解析
Aug 06 Python
pycharm进入时每次都是insert模式的解决方式
Feb 05 Python
Python办公自动化之教你如何用Python将任意文件转为PDF格式
Jun 28 Python
python pandas 解析(读取、写入)CSV 文件的操作方法
Dec 24 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
ThinkPHP实现将SESSION存入MYSQL的方法
2014/07/22 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
php实现微信支付之企业付款
2018/05/30 PHP
Javascript 中的类和闭包
2010/01/08 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
jQuery + Flex 通过拖拽方式动态改变图片的代码
2011/08/03 Javascript
ajax处理php返回json数据的实例代码
2013/01/24 Javascript
使用jQuery同时控制四张图片的伸缩实现代码
2013/04/19 Javascript
Javascript 拖拽雏形(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript、tab切换完整版(自动切换、鼠标移入停止、移开运行)
2016/01/05 Javascript
confirm确认对话框的实现方法总结
2016/06/17 Javascript
vue 返回上一页,页面样式错乱的解决
2019/11/14 Javascript
Js逆向实现滑动验证码图片还原的示例代码
2020/03/10 Javascript
[01:52]深扒TI7聊天轮盘语音出处7
2017/05/11 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
python实现倒计时的示例
2014/02/14 Python
使用python实现ANN
2017/12/20 Python
用Python获取摄像头并实时控制人脸的实现示例
2019/07/11 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
2019/09/16 Python
python3连接kafka模块pykafka生产者简单封装代码
2019/12/23 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
使用keras实现densenet和Xception的模型融合
2020/05/23 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
利用CSS的Sass预处理器(框架)来制作居中效果
2016/03/10 HTML / CSS
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
html5记忆翻牌游戏实现思路及代码
2013/07/25 HTML / CSS
旅游管理毕业生自荐书
2014/02/02 职场文书
土地转让协议书
2014/04/15 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
群众路线教育实践活动学习笔记内容
2014/11/06 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
毕业论文答辩演讲稿
2015/06/23 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
MySQL数据库如何给表设置约束详解
2022/03/13 MySQL
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
MongoDB误操作后使用oplog恢复数据
2022/04/11 MongoDB