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使用mailbox打印电子邮件的方法
Apr 30 Python
Python通过90行代码搭建一个音乐搜索工具
Jul 29 Python
python 连接sqlite及简单操作
Jun 30 Python
基于python的多进程共享变量正确打开方式
Apr 28 Python
彻彻底底地理解Python中的编码问题
Oct 15 Python
Python的log日志功能及设置方法
Jul 11 Python
Pycharm最新激活码2019(推荐)
Dec 31 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
Nov 10 Python
OpenCV全景图像拼接的实现示例
Jun 05 Python
python简单验证码识别的实现过程
Jun 20 Python
Python的property属性详细讲解
Apr 11 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实现按指定大小等比缩放生成上传图片缩略图的方法
2014/12/15 PHP
php判断数组中是否存在指定键(key)的方法
2015/03/17 PHP
codeigniter显示所有脚本执行时间的方法
2015/03/21 PHP
php实现编辑和保存文件的方法
2015/07/20 PHP
用javascript实现的仿Flash广告图片轮换效果
2007/04/24 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
2016/02/18 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
Vue.js 2.0学习教程之从基础到组件详解
2017/04/24 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
三剑客:offset、client和scroll还傻傻分不清?
2020/12/04 Javascript
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
Python 爬取携程所有机票的实例代码
2018/06/11 Python
Python中new方法的详解
2019/01/15 Python
PyQt+socket实现远程操作服务器的方法示例
2019/08/22 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
基于python检查矩阵计算结果
2020/05/21 Python
FC-Moto瑞典:欧洲最大的摩托车服装和头盔商店之一
2018/11/27 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
JAVA高级程序员面试题
2013/09/06 面试题
给酒店员工的表扬信
2014/01/11 职场文书
电子信息科学专业自荐信
2014/01/30 职场文书
交通事故赔偿协议书范本
2014/04/15 职场文书
2014年英语教师工作总结
2014/12/03 职场文书
2016年心理学教育培训学习心得体会
2016/01/12 职场文书
宫崎骏十大动画电影,宫崎骏好看的动画电影排名
2022/03/22 日漫
Python pyecharts绘制条形图详解
2022/04/02 Python
Go语言 详解net的tcp服务
2022/04/14 Golang