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不规范的日期字符串处理类
Jun 10 Python
Python编程对列表中字典元素进行排序的方法详解
May 26 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
Python使用pandas对数据进行差分运算的方法
Dec 22 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
Django框架使用mysql视图操作示例
May 15 Python
用Python画一个LinkinPark的logo代码实例
Sep 10 Python
详解python播放音频的三种方法
Sep 23 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
Django通过json格式收集主机信息
May 29 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 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
ThinkPHP的MVC开发机制实例解析
2014/08/23 PHP
PHP图片加水印实现方法
2016/05/06 PHP
浅谈Coreseek、Sphinx-for-chinaese、Sphinx+Scws的区别
2016/12/15 PHP
PHP设计模式之注册树模式分析
2018/01/26 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
javascript动画浅析
2012/08/30 Javascript
Javascript之面向对象--方法
2016/12/02 Javascript
vue.js+Echarts开发图表放大缩小功能实例
2017/06/09 Javascript
JS中定位 position 的使用实例代码
2017/08/06 Javascript
jQuery实现动态显示select下拉列表数据的方法
2018/02/05 jQuery
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
详解nuxt路由鉴权(express模板)
2018/11/21 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
小程序二次贝塞尔曲线实现购物车商品曲线飞入效果
2019/01/07 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
python cs架构实现简单文件传输
2020/03/20 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
五分钟学会怎么用Pygame做一个简单的贪吃蛇
2021/01/06 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
Marc O’Polo俄罗斯官方在线商店:德国高端时尚品牌
2019/12/26 全球购物
初中地理教学反思
2014/01/11 职场文书
四年大学生活的自我评价范文
2014/02/07 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
财务担保书范文
2014/04/02 职场文书
服务理念口号
2014/06/11 职场文书
2014年员工工作总结范文
2014/11/18 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
python绘制箱型图
2021/04/27 Python
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
Java存储没有重复元素的数组
2022/04/29 Java/Android