20 协议
2017-07-05 本文已影响60人
猴子的救兵520
协议的格式
- 协议的定义方式与类,结构体,枚举的定义都非常相似
protocol SomeProtocol {
// 协议方法
}
- 遵守协议的格式
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
// 类的内容
// 实现协议中的方法
}
协议的基本使用
- 定义协议和遵守协议
// 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("人在踢足球")
}
}
- 协议之间的继承
protocol CrazySportProtocol {
func jumping()
}
protocol SportProtocol : CrazySportProtocol {
func playBasketball()
func playFootball()
}
代理设计模式
- 协议继承用于代理设计模式
protocol BuyTicketProtocol : NSObjectProtocol {
func buyTicket()
}
class Person {
// 1.定义协议属性
weak var delegate : BuyTicketProtocol
// 2.自定义构造函数
init (delegate : BuyTicketProtocol) {
self.delegate = delegate
}
// 3.行为
func goToBeijing() {
delegate.buyTicket()
}
}
class HuangNiu: BuyTicketProtocol {
func buyTicket() {
print("买了一张火车票")
}
}
let p = Person(delegate: HuangNiu())
p.goToBeijing()
协议中方法的可选
// 1.定义协议
@objc protocol SportProtocol {
func playBasketball()
@objc optional func playFootball()
}
// 2.遵守协议
class Person : SportProtocol {
var name : String?
var age : Int = 0
// 实现协议中的方法
func playBasketball() {
print("人在打篮球")
}
}
- 注意:
- 要实现协议可选方法,上面代码示例中的两个 @objc 不能少,否则会报错如下:
error: 'optional' can only be applied to members of an @objc protocol
optional func playFootball()
^
error: 'optional' requirements are an Objective-C compatibility feature; add '@objc'
optional func playFootball()
^
@objc
协议的使用注意
- 协议的瘦身
定义 Swift 中的协议时,为了优化性能,可以不继承 NSObjectProtocol 协议,因为 NSObjectProtocol 中默认实现了很多方法,而这些方法我们不一定会用到,可以等需要时在继承。
但会出现下面的问题:
swift代理weak修饰报错.png报错意思是:weak 只能修饰 class 和 class-bound protocol 类型。
我自定义的协议 MainViewControllerDelegate 没有继承 NSObjectProtocol,所以自然也就不是 class-bound protocol 类型,也就不能用 weak 修饰。但不用 weak 修饰,又可能会造成循环引用的问题。
解决:
可以继承 class 类型
import UIKit
protocol MainViewControllerDelegate : class {
func deleFuc1() -> Int
}
class MainViewController: UIViewController {
// 这里的 weak 不会报错
weak var delegate : MainViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
}
其他资料
- 系列文章
01 Swift最基本的语法变化
02 Swift中的变量和常量
03 Swift中的数据类型
04 Swift逻辑分支
05 Swift中的循环
06 Switf中的字符串
07 Swift 数组
08 Swift字典
09 Swift 元组
10 Swift 可选类型
11 Swift 类型转化
12 Swift 函数
13 Swift 枚举类型
14 Swift 结构体
15 Swift 类的定义
16 Swift 类的构造函数
17 Swift 类的析构函数
18 自动引用计数
19 Swift 可选链
20 协议
21 闭包
22 Swift 懒加载
23 Swift 注释