问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Swift 3.0 中 protocol 中怎么添加可选方法

发布网友 发布时间:2022-04-18 21:06

我来回答

2个回答

懂视网 时间:2022-04-19 01:27

一、引言

协议约定了一些属性与方法,其作用类似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"
 }
}

热心网友 时间:2022-04-18 22:35

可以,但是很费力1、Apple推出swift语言只不过是完善他的这个封闭的生态圈,是在MAC系统的基础开发的2、在Windows搭载swift语言环境后就可以学习swift语言,但是会存在兼容问题
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 跪求高手的工商管理类英文文献! 推荐一篇经管类2014年发表的、著名的外文文献 我们的作业要翻译 急求国际贸易专业的文献综述 和外文翻译 财务管理学 关于企业偿债能力分析的外文文献及翻译 求一篇关于account receivable ,管理学方面的外文文献,2.5万字左右。我的邮箱是ashei2@163.com 急~求管理学相关前沿(两年内)外文文献及翻译3000到5000字左右 首都图书馆可以免费下载外文文献么 求一篇企业管理创新的外文文献,有1000多个单词左右就行,要注明出处 高分急求本科管理类外文文献,要求:外文文献英文带中文译文,译文不少于五千字。中英文均要求带简单目录 谁有管理类英文版文章、论文、电子书 求公共管理学外文文献 求关于管理学的英文文献一篇,文献要全英文的 管理类的外文文献中,量表一般会出现在哪里,怎么找啊 通过微信网友贷款,他说人民银行网上查征信,要用银行卡复印件,说纸质征信可造假,要银行卡密码,可信吗 求swift开发实战教程书籍 3dmax2015的模型,在2016版本打开,渲染的图不一样怎么回事? pkpm建模后渲染图怎么不显示楼板 solidworks可以渲染图片吗 一个完整的3D模型渲染图时最快能有多快 幽默的战争题材电影有哪些? 英语九年级全一册第八单元2d翻译 九年级八单元2d英语翻译 冰激凌和冰淇淋的区别,一直傻傻分不清楚 人教版九年级英语第8单元课文Advertising:pros and cons的翻译 人教版英语书第八单元 sectionA部分中的2d的翻译 初三英语全一册教科书第八单元62页2b求翻译,谢谢 初三英语第108页第八单元翻译中文 新目标九年级英语第8单元reading翻译 英语8下第九单元sectionsa66页2d翻译 人教版初三英语课文8单元reading的翻译 如何写保护地球环保倡议书? swift 中怎么调用其他类的协议 我的华为手机一开机就显示安卓系统暂停几字霸屏,该怎么办? 华为手机升级后为何开机显示android正在启动? 华为手机一觉醒来开不了机只出现AndroidHUAWEI进不了系统怎么办 手机开机出现android.phone已停止是什么意思 火上山的人气票也要收费吗 花非花雾非雾里所有张睿的歌的钢琴谱 花非花雾非雾简谱苏轼的 11月适合到国外哪个国家旅游?时间约12~14天。请说明理由。