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 Web框架Flask中使用七牛云存储实例
Feb 08 Python
讲解Python中if语句的嵌套用法
May 14 Python
Python使用redis pool的一种单例实现方式
Apr 16 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
python 获取网页编码方式实现代码
Mar 11 Python
python中利用zfill方法自动给数字前面补0
Apr 10 Python
python模拟表单提交登录图书馆
Apr 27 Python
基于Python打造账号共享浏览器功能
May 30 Python
python如何实现读取并显示图片(不需要图形界面)
Jul 08 Python
Python 使用生成器代替线程的方法
Aug 04 Python
python 录制系统声音的示例
Dec 21 Python
Python四款GUI图形界面库介绍
Jun 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
SONY SRF-40W电路分析
2021/03/02 无线电
php下检测字符串是否是utf8编码的代码
2008/06/28 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
WordPress开发中用于标题显示的相关函数使用解析
2016/01/07 PHP
Docker搭建自己的PHP开发环境
2018/02/24 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
锋利的jQuery jQuery中的DOM操作
2010/03/21 Javascript
JavaScript中几种常见排序算法小结
2011/02/22 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
Backbone.js 0.9.2 源码注释中文翻译版
2015/06/25 Javascript
js中创建对象的几种方式
2017/02/05 Javascript
JavaScript实现获取用户单击body中所有A标签内容的方法
2017/06/05 Javascript
微信小程序 实现点击添加移除class
2017/06/12 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
JavaScript数组去重实现方法小结
2020/01/17 Javascript
[01:11:15]VGJ.S vs Secret 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Python中修改字符串的四种方法
2018/11/02 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
python批量处理文件或文件夹
2020/07/28 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
详解python日志输出使用配置文件格式
2021/02/10 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
大学生求职简历的自我评价范文
2013/10/12 职场文书
七年级生物教学反思
2014/01/30 职场文书
煤矿安全生产责任书
2014/04/15 职场文书
全国助残日活动总结
2015/05/11 职场文书
小王子读书笔记
2015/06/29 职场文书
继承Win10缺点!教你关闭Win11烦人的网络搜索
2021/11/23 数码科技
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL
JS函数式编程实现XDM一
2022/06/16 Javascript