Swift中的协议(protocol)学习教程
一、引言
协议约定了一些属性与方法,其作用类似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" } }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

vivo快充主要有两个协议:1、“QC 2.0”快充协议,“QC2.0”就是“Quick Charge 2.0”技术,是高通公司发布的快充技术2.0版本,可以输出5V、9V、12V、20V四组电压;2、PD快充协议,是由“USB-IF”组织制定的一种快速充电规范,是目前主流的快充协议之一,可以使目前默认最大功率“5V/2A”的“type-c”接口提高到100W。

pd3.0快充协议最高支持“100W”。2015年11月,USB PD快充迎来了大版本更新,进入到了USB PD3.0快充时代;PD3.0协议支持5V3A、9V3A、12V3A、15V3A、20V5A输出,最大功率可以到100W,不仅可以用在手机充电上,还可以用给笔记本或者是显示器供电。

proxyprotocol在nginx中应用我们知道nginx是一个web服务器和代理服务器,它一般工作在proxyserver或者负载均衡软件(Haproxy,AmazonElasticLoadBalancer(ELB)的后面。客户端首先请求proxyserver或者LSB负载均衡软件,然后再到nginx进行真实的web访问。因为经过了多层软件,所以客户端的一些信息比如ip地址,端口号等可能就会被隐藏,这对于我们问题分析,数据统计都是不利的。因为对于nginx来说,我们希望能够获得真实的客户端

7月31日消息,苹果公司昨日(7月30日)发布新闻稿,宣布推出新的开源Swift包(swift-homomorphic-encryption),用于在Swift编程语言中启用同态加密。注:同态加密(HomomorphicEncryption,HE)是指满足密文同态运算性质的加密算法,即数据经过同态加密之后,对密文进行特定的计算,得到的密文计算结果在进行对应的同态解密后的明文等同于对明文数据直接进行相同的计算,实现数据的“可算不可见”。同态加密技术可以计算加密数据,而且不会向操作过程泄露底层的未加

如何使用MySQL在Swift中实现数据导入和导出功能导入和导出数据是许多应用程序中常见的功能之一。本文将展示在Swift语言中使用MySQL数据库实现数据导入和导出的方法,并提供代码示例。要使用MySQL数据库,首先需要在Swift项目中引入相应的库文件。你可以通过在Package.swift文件中添加以下依赖来实现:dependencies:[

5种工业通讯协议:1、Modbus协议,是应用于电子控制器上的一种通用语言;2、RS-232协议,是一种串行物理接口标准;3、RS-485协议,是在RS232的基础上发展来的;4、HART协议,是一种用于现场智能仪表和控制室设备之间的通信协议;5、MPI协议,是一个跨语言的通讯协议,用于编写并行计算机。

Vue.js是一种流行的JavaScript框架,用于构建用户界面。而Swift语言是一种用于iOS和macOS应用程序开发的编程语言。在本文中,我将探讨如何将Vue.js与Swift语言集成,以实现高级iOS应用程序的开发和测试。在开始之前,我们需要确保你已经安装了以下软件和工具:Xcode:用于开发和编译iOS应用程序的集成开发环境。Node.js:用于

随着互联网技术的不断发展,越来越多的企业级应用需要向其它应用程序提供接口以实现数据和业务的交互。在这种情况下,我们需要一种可靠的协议来传输数据并确保数据的完整性和安全性。SOAP(SimpleObjectAccessProtocol)就是一种基于XML的协议,可用于在Web环境中实现应用之间的通信。而PHP作为一种流行的Web编程语言,
