Swift基础语法-协议


1. 协议的格式

  • 协议的定义方式与类,结构体,枚举的定义都非常相似

  • 协议默认可以被类/结构体/枚举类型遵守

  • 格式:

protocol 协议名称 {
    // 协议方法
}
protocol 协议名称 : 父协议1,父协议2,...,  {
    // 协议方法
}

2. 协议的基本使用

  • 定义协议和遵守协议
    • 注意: 默认情况下在swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错
// 1.定义协议
// 注意:默认情况下在swift中所有的协议方法都是必须实现的,如果不实现,则编译器会报错
// 如果继承自基协议可以继承自NSObjectProtocol
protocol SportProtocol {
    // 协议中的方法, 要求遵守协议者, 必须实现, 不实现则直接报错
    func playBasketball()
    func playFootball()
}
// 2.遵守协议
// 定义一个类,让类遵守协议
class Person : SportProtocol {
    // 遵守协议, 必须实现协议中方法, 不实现则直接报错
    func playBasketball() {
        print("打篮球")
    }
    
    func playFootball() {
        print("踢足球")
    }
}
  • 协议之间的继承
    • 如果继承自基协议可以继承自NSObjectProtocol
protocol CrazySportProtocol {
    func jumping()
}

protocol SportProtocol : CrazySportProtocol {
    func playBasketball()
    func playFootball()
}

3. 代理设计模式

  • 协议继承用于代理设计模式
    • 协议默认可以被类/结构体/枚举类型遵守
    • 要让类中的属性使用weak修饰, 并遵守某协议, 则某协议一定要指定只能被类遵守, 则需要协议继承自class协议, 即是名称后面加上关键字class, 如下代码:
// : class : 表示该协议只能被类遵守,不能被结构体/枚举类型遵守
protocol BuyTicketProtocol : class {
    func buyTicket()
}
class Person {
    var name : String = ""
    // 使用 weak 修饰遵循协议的属性, 则该协议必须遵循 class 协议, 
    // 如果没有遵循该协议则直接报错
    weak var delegate : BuyTicketProtocol? 
    //可以在定义属性或者变量的时候在协议名称后面添加问号`?`表示是可选类型, 
    //表示该属性可以没有代理
    
    func goToBeijing() {
        // 1.买火车票
        
        // 2.乘车去北京
        print("坐车去北京")
    }
}
class HuangNiu : BuyTicketProtocol {
    func buyTicket() {
        print("帮客户买一张票")
    }
}
let p = Person(delegate: HuangNiu())
p.goToBeijing()

4. 协议中方法的可选

  • swift 是非常严谨的语言, 协议中的方法必须都要实现, 如果非要出现可选型的方法, 则需要将 Swift 的语言转为 OC 的语法, 需要用到关键字 @objcoptional, 示例如下:
// 1.定义协议
@objc
protocol SportProtocol {
    func playBasketball()

    optional func playFootball()
}

// 2.遵守协议
class Person : SportProtocol {
    var name : String?
    var age : Int = 0

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

你可能感兴趣的:(Swift基础语法-协议)