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怎么学好python?
Oct 07 Python
分析python服务器拒绝服务攻击代码
Jan 16 Python
Python程序设计入门(3)数组的使用
Jun 16 Python
pandas数据框,统计某列数据对应的个数方法
Apr 11 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
程序员的七夕用30行代码让Python化身表白神器
Aug 07 Python
基于Python新建用户并产生随机密码过程解析
Oct 08 Python
浅谈tensorflow之内存暴涨问题
Feb 05 Python
pandas的resample重采样的使用
Apr 24 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
Jun 08 Python
Python调用C/C++的方法解析
Aug 05 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缓存函数的使用说明
2013/05/10 PHP
php使用sql server验证连接数据库的方法
2014/12/25 PHP
php编写简单的文章发布程序
2015/06/18 PHP
TNC vs IO BO3 第一场2.13
2021/03/10 DOTA
javascript之解决IE下不渲染的bug
2007/06/29 Javascript
Javascript的各种节点操作实例演示代码
2012/06/27 Javascript
JS继承--原型链继承和类式继承
2013/04/08 Javascript
javascript 函数及作用域总结介绍
2013/11/12 Javascript
jquery实现的图片点击滚动效果
2014/04/29 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
js实现带有介绍的Select列表菜单实例
2015/08/18 Javascript
举例讲解JavaScript substring()的使用方法
2015/11/09 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
HTML中setCapture、releaseCapture 使用方法浅析
2016/09/25 Javascript
JS实现搜索框文字可删除功能
2016/12/28 Javascript
JavaScript实现星级评分
2017/01/12 Javascript
vue 虚拟dom的patch源码分析
2018/03/01 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
2018/08/14 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
详解JavaScript 异步编程
2020/07/13 Javascript
PHP 502bad gateway原因及解决方案
2020/11/13 Javascript
python中list循环语句用法实例
2014/11/10 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Django Web开发中django-debug-toolbar的配置以及使用
2018/05/06 Python
python中强大的format函数实例详解
2018/12/05 Python
新建文件时Pycharm中自动设置头部模板信息的方法
2020/04/17 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
加拿大女鞋品牌:ALDO
2016/11/13 全球购物
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
后勤人员自我鉴定
2013/10/20 职场文书
《雨点》教学反思
2014/02/12 职场文书
个人担保书范文
2014/05/20 职场文书
怎样写好演讲稿题目?
2019/08/21 职场文书