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中实现结构相似的函数调用方法
Mar 10 Python
Python实现简单字典树的方法
Apr 29 Python
用Python解决计数原理问题的方法
Aug 04 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
Feb 01 Python
解决python线程卡死的问题
Feb 18 Python
python中嵌套函数的实操步骤
Feb 27 Python
详解python调用cmd命令三种方法
Jul 08 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
selenium 多窗口切换的实现(windows)
Jan 18 Python
如何通过python计算圆周率PI
Nov 11 Python
python神经网络编程之手写数字识别
May 08 Python
python中pd.cut()与pd.qcut()的对比及示例
Jun 16 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
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
php短址转换实现方法
2015/02/25 PHP
php遍历CSV类实例
2015/04/14 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
PHP操作Postgresql封装类与应用完整实例
2018/04/24 PHP
PDO::getAttribute讲解
2019/01/28 PHP
解决IE下select标签innerHTML插入option的BUG(兼容IE,FF,Opera,Chrome,Safari)
2010/05/13 Javascript
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
2013/09/18 Javascript
Javascript 6里的4个新语法
2016/08/25 Javascript
jQuery实现的网页换肤效果示例
2016/09/20 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
vue watch自动检测数据变化实时渲染的方法
2018/01/16 Javascript
示例vue 的keep-alive缓存功能的实现
2018/12/13 Javascript
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
Python之re操作方法(详解)
2017/06/14 Python
python实现随机梯度下降法
2020/03/24 Python
基于python实现高速视频传输程序
2019/05/05 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
Kmeans均值聚类算法原理以及Python如何实现
2020/09/26 Python
5款实用的python 工具推荐
2020/10/13 Python
纯CSS3实现带动画效果导航菜单无需js
2013/09/27 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
大学毕业自我评价
2014/02/02 职场文书
员工入职担保书范文
2014/04/01 职场文书
2015年乡镇财政工作总结
2015/05/19 职场文书
离婚案件答辩状
2015/05/22 职场文书
python turtle绘制多边形和跳跃和改变速度特效
2022/03/16 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js
3050和2060哪个好 性能差多少 差距有多大 谁更有性价比
2022/06/17 数码科技