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中实现两个字典(dict)合并的方法
Sep 23 Python
在Python的Flask框架中实现全文搜索功能
Apr 20 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
3个用于数据科学的顶级Python库
Sep 29 Python
在Python中分别打印列表中的每一个元素方法
Nov 07 Python
浅析python3字符串格式化format()函数的简单用法
Dec 07 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
解决Atom安装Hydrogen无法运行python3的问题
Aug 28 Python
Python实现分数序列求和
Feb 25 Python
基于tensorflow for循环 while循环案例
Jun 30 Python
Python判断字符串是否为合法标示符操作
Sep 03 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
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
PHP导航下拉菜单的实现如此简单
2013/09/22 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
10个php函数实用却不常见
2015/10/13 PHP
Laravel实现自定义错误输出内容的方法
2016/10/10 PHP
File文件控件,选中文件(图片,flash,视频)即立即预览显示
2009/04/09 Javascript
Jquery css函数用法(判断标签是否拥有某属性)
2011/05/28 Javascript
微信小程序之ES6与事项助手的功能实现
2016/11/30 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
Angularjs 动态改变title标题(兼容ios)
2016/12/29 Javascript
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
2020/06/15 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
2020/08/03 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
为什么Python中没有"a++"这种写法
2018/11/27 Python
Python实现判断一个整数是否为回文数算法示例
2019/03/02 Python
python3+selenium获取页面加载的所有静态资源文件链接操作
2020/05/04 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
英国复古服装购物网站:Collectif
2019/10/30 全球购物
辅导员评语
2014/05/04 职场文书
2014派出所所长群众路线对照检查材料思想汇报
2014/09/18 职场文书
社区母亲节活动总结
2015/02/10 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
背起爸爸上学观后感
2015/06/08 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2015年中秋节主持词
2015/07/30 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
HTML+CSS 实现顶部导航栏菜单制作
2021/06/03 HTML / CSS
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Pytest中conftest.py的用法
2021/06/27 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android