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获取从命令行输入数字的方法
Apr 29 Python
python实现对一个完整url进行分割的方法
Apr 29 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
python for循环输入一个矩阵的实例
Nov 14 Python
Python 2/3下处理cjk编码的zip文件的方法
Apr 26 Python
Python数学形态学实例分析
Sep 06 Python
python树的同构学习笔记
Sep 14 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
tensorflow2.0的函数签名与图结构(推荐)
Apr 28 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Python采集壁纸并实现炫轮播
Apr 30 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函数serialize()与unserialize()用法实例
2014/11/06 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
zend framework重定向方法小结
2016/05/28 PHP
总结PHP中DateTime的常用方法
2016/08/11 PHP
Js 中debug方式
2010/02/07 Javascript
将input file的选择的文件清空的两种解决方案
2013/10/21 Javascript
JQuery中的html()、text()、val()区别示例介绍
2014/09/01 Javascript
分享一个精简的vue.js 图片lazyload插件实例
2017/03/13 Javascript
JS检测数组类型的方法小结
2017/03/14 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
vue判断input输入内容全是空格的方法
2018/03/02 Javascript
详解微信小程序网络请求接口封装实例
2019/05/02 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
解决ant Design Search无法输入内容的问题
2020/10/29 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
Python进行数据科学工作的简单入门教程
2015/04/01 Python
python3实现短网址和数字相互转换的方法
2015/04/28 Python
Python基于回溯法子集树模板实现图的遍历功能示例
2017/09/05 Python
python如何求解两数的最大公约数
2018/09/27 Python
python实现求特征选择的信息增益
2018/12/18 Python
python输出电脑上所有的串口名的方法
2019/07/02 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
学python安装的软件总结
2019/10/12 Python
Python 中如何实现参数化测试的方法示例
2019/12/10 Python
PyTorch使用cpu加载模型运算方式
2020/01/13 Python
Python如何定义有可选参数的元类
2020/07/31 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
2021/03/01 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
银行会计职员个人的自我评价
2013/09/29 职场文书
商务会议邀请函
2014/01/09 职场文书
高中毕业生登记表自我鉴定范文
2014/03/18 职场文书
小学优秀班集体申报材料
2014/05/25 职场文书
安全标兵事迹材料
2014/08/17 职场文书