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正则表达式如何进行字符串替换实例
Dec 28 Python
使用Python生成XML的方法实例
Mar 21 Python
python opencv之分水岭算法示例
Feb 24 Python
python实现图片文件批量重命名
Mar 23 Python
利用Python如何批量修改数据库执行Sql文件
Jul 29 Python
python实现播放音频和录音功能示例代码
Dec 30 Python
tensorflow如何继续训练之前保存的模型实例
Jan 21 Python
使用python 计算百分位数实现数据分箱代码
Mar 03 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
如何用tempfile库创建python进程中的临时文件
Jan 28 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
Python可变集合和不可变集合的构造方法大全
Dec 06 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 class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
thinkphp缓存技术详解
2014/12/09 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
JavaScript的Vue.js库入门学习教程
2016/05/23 Javascript
微信小程序 石头剪刀布实例代码
2017/01/04 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
jquery实现倒计时小应用
2017/09/19 jQuery
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
javascript 函数的暂停和恢复实例详解
2020/04/25 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
Python文件和目录操作详解
2015/02/08 Python
Python在Windows和在Linux下调用动态链接库的教程
2015/08/18 Python
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
解决Python获取字典dict中不存在的值时出错问题
2018/10/17 Python
python with (as)语句实例详解
2020/02/04 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
使用keras根据层名称来初始化网络
2020/05/21 Python
Gap加拿大官网:Gap Canada
2017/08/24 全球购物
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
nohup的用法
2012/11/26 面试题
总经理秘书的岗位职责
2013/12/27 职场文书
驾驶员岗位职责
2014/01/29 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
4s店销售经理岗位职责
2014/07/19 职场文书
技术入股合作协议书
2014/10/07 职场文书
事业单位个人总结
2015/02/12 职场文书
小学生优秀作文范文(六篇)
2019/07/10 职场文书
Python OpenGL基本配置方式
2022/05/20 Python