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嵌套函数使用外部函数变量的方法(Python2和Python3)
Jan 31 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
Jun 07 Python
pandas series序列转化为星期几的实例
Apr 11 Python
Python进阶之自定义对象实现切片功能
Jan 07 Python
Python深拷贝与浅拷贝用法实例分析
May 05 Python
python实现websocket的客户端压力测试
Jun 25 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 Python
python中如何对多变量连续赋值
Jun 03 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
escape unescape的php下的实现方法
2007/04/27 PHP
php实现检查文章是否被百度收录
2015/01/27 PHP
yii2简单使用less代替css示例
2017/03/10 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
PHP中number_format()函数的用法讲解
2019/04/08 PHP
PHP批斗大会之缺失的异常详解
2019/07/09 PHP
JavaScript 基础知识 被自己遗忘的
2009/10/15 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
jquery dataTable 获取某行数据
2017/05/05 jQuery
配置nodejs环境的方法
2017/05/13 NodeJs
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
vue路由中前进后退的一些事儿
2019/05/18 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
解决pandas.DataFrame.fillna 填充Nan失败的问题
2018/11/06 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
Django实现内容缓存实例方法
2020/06/30 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
简单几步用纯CSS3实现3D翻转效果
2019/01/17 HTML / CSS
详解css position 5种不同的值的用法
2019/07/30 HTML / CSS
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
悬挂训练绳:TRX
2017/12/14 全球购物
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
英国顶尖手表珠宝品牌独家授权经销商:HS Johnson
2020/10/28 全球购物
《新型玻璃》教学反思
2014/04/13 职场文书
局火灾防控工作方案
2014/05/25 职场文书
家庭经济困难证明
2015/06/23 职场文书
求职信如何撰写?
2019/05/22 职场文书
Nginx内网单机反向代理的实现
2021/11/07 Servers