前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >20.Swift学习之协议

20.Swift学习之协议

作者头像
YungFan
发布2018-12-12 17:43:21
3010
发布2018-12-12 17:43:21
举报
文章被收录于专栏:学海无涯学海无涯
协议

协议为方法、属性、以及其他特定的任务需求或功能定义一个大致的框架。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足了协议中需求的任意类型都叫做遵循了该协议。

协议的格式
  • 协议的定义方式与类,结构体,枚举的定义都非常相似
代码语言:javascript
复制
protocol SomeProtocol {
    // 属性
    // 方法
}
  • 协议中的属性
    • 不可以有默认值
    • 必须设置是{get}或者{get set} ,注意:get与set之间是没有逗号的
    • 必须设置为var
  • 协议中的方法
    • 可以定义普通方法也可以是mutating方法
    • 方法不能有方法体
    • 方法的参数不可以有默认值
代码语言:javascript
复制
protocol Pet {
    // 定义属性
    var name: String {get set}
    var age: String {get}
    // 定义方法
    func feed(food: String)
    mutating func shout(sound :String);
}
  • 遵守协议的格式
代码语言:javascript
复制
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 类的内容
    // 实现协议中的方法
}
  • 实现协议中的属性
    • 此时属性可以设置默认值
    • 协议中属性为可读可写的,可以直接声明为var类型就可以
    • 协议中属性为可读属性,可以直接声明为let类型就可以,也可以声明为var类型
  • 实现协议中的方法
    • 可以为方法中的参数设置默认值
    • 在结构体中,如果需要改变自身的值,需要在方法前面加mutating关键字。在协议的方法中添加mutating关键字,如果结构体来遵守协议,需要有mutating这个关键字,如果是类来遵守协议,mutating关键字就不需要了。
协议的基本使用
  • 定义协议和遵守协议
代码语言:javascript
复制
// 1.定义协议
protocol SportProtocol {
    func playBasketball()
    func playFootball()
}

// 2.遵守协议
// 注意:默认情况下在Swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

    // 实现协议中的方法
    func playBasketball() {
        print("人在打篮球")
    }

    func playFootball() {
        print("人在踢足球")
    }
}
  • 协议之间的继承
代码语言:javascript
复制
protocol CrazySportProtocol {
    func jumping()
}

protocol SportProtocol : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}
代理设计模式
  • 协议继承用于代理设计模式
代码语言:javascript
复制
protocol BuyTicketProtocol {
    func buyTicket()
}
代码语言:javascript
复制
class Person {
    // 1.定义协议属性
    var delegate : BuyTicketProtocol

    // 2.自定义构造函数
    init (delegate : BuyTicketProtocol) {
        self.delegate = delegate
    }

    // 3.行为
    func goToBeijing() {
        print("找黄牛买票")
        delegate.buyTicket()
        print("拿到票去北京")
    }
}
代码语言:javascript
复制
class HuangNiu: BuyTicketProtocol {
    func buyTicket() {
        print("黄牛帮忙买了一张火车票")
    }
}
代码语言:javascript
复制
let p = Person(delegate: HuangNiu())
p.goToBeijing()
协议中方法的可选
方法一
  • 定义协议
代码语言:javascript
复制
@objc protocol SportProtocol {
    func playBasketball()
    optional func playFootball()
}
  • 遵守协议
代码语言:javascript
复制
class Person : SportProtocol {
    var name : String?
    var age : Int = 0
    // 实现协议中的方法
    @objc func playBasketball() {
        print("人在打篮球")
    }
}
方法二

扩展协议

代码语言:javascript
复制
protocol SomeProtocol {
    func requiredFunc()
    func optionalFunc()
}
extension SomeProtocol {
    func optionalFunc() {
      print("optionalFunc扩展中实现")
    }
}

Class SomeClass: SomeProtocol {
    func requiredFunc() {
      print("requiredFunc具体类中实现")
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 协议
  • 协议的格式
  • 协议的基本使用
  • 代理设计模式
  • 协议中方法的可选
    • 方法一
      • 方法二
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档