swift3 协议 使用类、结构体、枚举来实现
在对协议进行声明和子类的实现之前,先聊一下声明协议属性的get和set还有子类可能会用到的mutating
1、get和set
在协议中声明属性则需要设置对应的get或者set方法
var simpleDesc: String {get}
上述则说明了子类对于simpleDesc的实现至少是get方法
var simpleDesc: String {get set}
上述则说明了子类对于simpleDesc的实现需要get和set方法
2、mutating
正常在协议中声明的时候无需指定mutating或者nonmutating,但是如果子类是结构体或者枚举而不是class,并且该函数会修改结构体中的参数则需要使用mutating,明确不能修改则使用nonmutating
一、协议声明
protocol ExampleProtocol { var simpleDesc: String {get} mutating func adjust() }
二、类继承
class SimpleClass: ExampleProtocol { var simpleDesc: String = "A very simpleclass" func adjust() { simpleDesc += " not adjust" } }
let sc = SimpleClass() sc.simpleDesc = "sdfsdf" sc.adjust() print(sc.simpleDesc)
这里使用let的方式,但是依旧能够对simpleDesc和adjust进行复制和调用
三、结构体继承
struct SimpleStruct: ExampleProtocol { var simpleDesc: String = "SimpleStruct" mutating func adjust() { simpleDesc += " not adjust" } }
这里如果跟“二”一样使用let的方式,就会报错,提示"Cannot assign to property: 'ss' is a 'let' constant"
这里只能使用var的方式,并且mutating这个关键字要显示标识。
四、枚举继承
swift的枚举跟其他语言的枚举有不同的地方是:可以对case项指定传入参数,并且可以在枚举中定义属性和函数
enum SimpleEnum: ExampleProtocol { case First(String), Second(String) var simpleDesc: String { get { switch self { case let .First(text): return text case let .Second(text): return text } } } mutating func adjust() { switch self { case let .First(text): self = .First(text + " adjust") case let .Second(text): self = .Second(text + " adjust") } } }
1、指定的属性,通过实现协议中指定的get或者set来对simpleDesc的读取
2、这里均使用了switch-case的方式累枚举所有enum里面的case
3、因为simpleDesc存储的参数是放在case传入的参数所以当要更新simpleDesc,则需要新建case;详见adjust()
var first = SimpleEnum.First("first") print(first.simpleDesc) first.adjust() print(first.simpleDesc)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!