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中assert用法实例分析
Apr 30 Python
Python实现的矩阵类实例
Aug 22 Python
python交互式图形编程实例(一)
Nov 17 Python
python实现对求解最长回文子串的动态规划算法
Jun 02 Python
python实现事件驱动
Nov 21 Python
python版本五子棋的实现代码
Dec 11 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
Jul 23 Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 Python
Python爬虫抓取指定网页图片代码实例
Jul 24 Python
对Pytorch 中的contiguous理解说明
Mar 03 Python
matlab xlabel位置的设置方式
May 21 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
新闻分类录入、显示系统
2006/10/09 PHP
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
3种php生成唯一id的方法
2015/11/23 PHP
PHP加密技术的简单实现
2016/09/04 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
hover的用法及live的用法介绍(鼠标悬停效果)
2013/03/29 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
jQuery实现点击查看大图并以弹框的形式居中
2016/08/08 Javascript
整理关于Bootstrap表单的慕课笔记
2017/03/29 Javascript
浅谈Node.js轻量级Web框架Express4.x使用指南
2017/05/03 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
jQuery操作DOM_动力节点Java学院整理
2017/07/04 jQuery
bootstrap select下拉搜索插件使用方法详解
2017/11/23 Javascript
微信小程序自定义可滑动顶部TabBar选项卡实现页面切换功能示例
2019/05/14 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
python生成IP段的方法
2015/07/07 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
如何基于python操作json文件获取内容
2019/12/24 Python
python字符串判断密码强弱
2020/03/18 Python
为智能设备设计个性化保护套网站:caseable
2017/01/05 全球购物
Cocopanda波兰:购买化妆品、护肤品、护发和香水
2020/05/25 全球购物
2014道德模范事迹材料
2014/02/16 职场文书
低碳生活倡议书
2014/04/14 职场文书
责任书格式范文
2014/07/28 职场文书
MySQL 表空间碎片的概念及相关问题解决
2021/05/07 MySQL
Java 泛型详解(超详细的java泛型方法解析)
2021/07/02 Java/Android