Swift基础语法-协议
2016-08-01 本文已影响34人
DwightChan
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 的语法, 需要用到关键字
@objc
和optional
, 示例如下:
// 1.定义协议
@objc
protocol SportProtocol {
func playBasketball()
optional func playFootball()
}
// 2.遵守协议
class Person : SportProtocol {
var name : String?
var age : Int = 0
// 实现协议中的方法
@objc func playBasketball() {
print("人在打篮球")
}
}