Swift3.0- 协议(protocol)

浅浅的花香味﹌ 2023-10-17 10:13 106阅读 0赞

Swift3.0- 协议(protocol)代理,委托

  1. /*
  2. * Protocol协议 (接口Interface或者纯虚函数)
  3. 协议用于统一方法和属性的名称,而不实现任何功能(使用代理设计模式)
  4. 协议能够被类、枚举、结构体实现,满足协议要求的类、枚举被称为协议实现者
  5. 实现者需要提供协议指定的成员,如属性、操作符、方法和下表等
  6. */
  7. protocol SomeProtocol{
  8. var musBeSttable:Int{get set}
  9. static func someType()
  10. }
  11. protocol FirstProtocol{
  12. }
  13. protocol SecondProtocol{
  14. }
  15. //实现协议时,在类、结构体、枚举后面加上协议名称,多个协议之间以“,”隔开
  16. struct SomeStructs:FirstProtocol,SecondProtocol {
  17. }
  18. class Father{
  19. }
  20. //某个类含有父类的同时并实现了协议,应当将父类放在所有协议之前
  21. class Son:Father,SomeProtocol{
  22. internal var musBeSttable: Int = 0
  23. internal static func someType() {
  24. print("son")
  25. }
  26. }
  27. var son = Son()
  28. Son.someType()
  29. protocol Togglable{
  30. mutating func toggle()
  31. }
  32. enum OnOffSwitch:Togglable {
  33. case Off,On
  34. mutating func toggle() {
  35. switch self {
  36. case .Off:
  37. self = .On
  38. case .On:
  39. self = .Off
  40. }
  41. }
  42. }
  43. var lightSwitch = OnOffSwitch.Off
  44. lightSwitch.toggle()
  45. //使用协议构造函数
  46. protocol AProtocol{
  47. init(someParameter:Int)
  48. }
  49. class SomeClass: AProtocol {
  50. required init(someParameter:Int) {
  51. }
  52. }
  53. /*
  54. * 委托、代理 (一种设计模式)
  55. 委托/代理是一种设计模式,允许类或者结构体将一些他们需要负责的功能交由(委托)给其他类型
  56. 委托模式可以用来响应特定的动作或者接受外部数据源提供的数据,而无需知道外部数据源的类型
  57. */
  58. /*
  59. * 协议合成protocol<,,...>
  60. */
  61. protocol Named {
  62. var name:String{get}
  63. }
  64. protocol Aged {
  65. var age:Int{get}
  66. }
  67. struct Person:Named,Aged {
  68. var name: String
  69. var age:Int
  70. }
  71. func wishHappayBirthday(celebrator:Named & Aged){
  72. print("协议合成:\nHappy birthday to \(celebrator.name) - you are \(celebrator.age)")
  73. }
  74. let person = Person(name:"John",age:16)
  75. wishHappayBirthday(celebrator: person)
  76. /*
  77. * 检验协议一致性
  78. is操作符检查实例是否实现了某个协议
  79. as?返回一个可选值,当实例实现协议时,返回该协议类型,否则返回nil
  80. as用以强制向下转换类型
  81. */
  82. //@objc表示协议是可选的,!!!且只对类有效
  83. @objc protocol HasArea{
  84. var area:Double {get}
  85. }
  86. class Circle:HasArea {
  87. let pi = 3.1415927
  88. var radius:Double
  89. var area:Double{//计算属性
  90. return pi * radius * radius
  91. }
  92. init(radius:Double) {
  93. self.radius = radius
  94. }
  95. }
  96. class Country:HasArea{
  97. var area: Double //存储属性
  98. init(area:Double) {
  99. self.area = area
  100. }
  101. }
  102. class Animal{
  103. var legs:Int
  104. init(legs:Int) {
  105. self.legs = legs
  106. }
  107. }
  108. let objects:[AnyObject] = [Circle(radius:2.0),
  109. Country(area:243_610),
  110. Animal(legs:80)
  111. ]
  112. for object in objects{
  113. if let objWithA = object as? HasArea{
  114. print("obj is \(objWithA.area)")
  115. }
  116. else{
  117. print("some thing does not have area")
  118. }
  119. }
  120. /*
  121. * 可选协议
  122. 协议中使用optional关键字定义可选成员
  123. 可选协议只能在含有@objc前缀的协议中生效;且@objc的协议只能被类实现
  124. */
  125. print("可选协议")
  126. @objc protocol CountDataSource{
  127. @objc optional func increForCount(count:Int) -> Int
  128. @objc optional var fixedIncrement:Int{get}
  129. }
  130. class Counter{
  131. var count = 0
  132. var dataSource:CountDataSource?
  133. func increment() {
  134. if let amount = dataSource?.increForCount?(count:count){
  135. count += amount
  136. }else if let amount = dataSource?.fixedIncrement{
  137. count += amount
  138. }
  139. }
  140. }
  141. class TreeSource: CountDataSource {
  142. let fixedIncrement = 3
  143. }
  144. var counter = Counter()
  145. counter.dataSource = TreeSource()
  146. for _ in 1...4{
  147. counter.increment()
  148. print(counter.count)
  149. }

发表评论

表情:
评论列表 (有 0 条评论,106人围观)

还没有评论,来说两句吧...

相关阅读

    相关 object-c的protocol(协议

    在object-c中,协议的声明类似于类接口的声明,但是,协议没有父类,而且不能定义成员变量,只能定义成员函数,而且成员函数并不是在这个协议中实现,而是要在使用它的类中实现。

    相关 Netty序列化协议Protocol buff

    序列化协议 序列化和反序列化 把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化。用途:文件的copy、网络数据的传输 Pro

    相关 Swift采用语言服务器协议

    苹果的Swift团队宣布,他们将为Swift提供语言服务器协议(LSP)支持。这将为开发者提供在支持LSP的任何编辑器中使用Swift的可能性,并获得代码补全、语法高亮等功能。