一则果、協(xié)議的基本使用:
- 協(xié)議的定義格式:協(xié)議的定義方式與類,結(jié)構(gòu)體,枚舉的定義都非常相似
protocol Study{
//協(xié)議方法
func test()
}
- 遵守協(xié)議的格式:
class Person:Study{
func test() {
print("好好學(xué)習(xí)")
}
}
- 定義協(xié)議和遵守協(xié)議:
- 類、結(jié)構(gòu)體亥贸、枚舉都可以遵循協(xié)議
/*** 類遵循Study協(xié)議 ***/
class Person:Study{
func test() {
print("好好學(xué)習(xí)")
}
}
/*** 枚舉遵循Study協(xié)議 ***/
enum StudyType:Study{
case study01
func test() {
print("學(xué)習(xí)方式")
}
}
StudyType.study01.test()
/*** 結(jié)構(gòu)體遵循Study協(xié)議 ***/
struct Jiegouti:Study{
func test() {
print("結(jié)構(gòu)體")
}
}
-
注意區(qū)分類繼承和遵循協(xié)議的寫法。
- 如果是冒號":"后面是接口就遵循接口浇垦,如果是類炕置,就是繼承。
協(xié)議之間的繼承:
protocol StudyHard:Study{
func test2()
}
class Person2:StudyHard{
func test() {
print("學(xué)習(xí)")
}
func test2() {
print("好好學(xué)習(xí)")
}
}
二男韧、協(xié)議中代理的使用
- 協(xié)議繼承用于代理設(shè)計模式
- 案例
protocol WPrint{
func test()
}
class BlackPrint:WPrint{
func test() {
print("黑白打印機")
}
}
class ColorPrint:WPrint{
func test() {
print("彩色打印機")
}
}
class Person1{
var delegate:WPrint?
func work(){
delegate?.test()
}
}
let p = Person1()
let black = BlackPrint()
let color = ColorPrint()
p.delegate = black
p.work() //黑白打印機
p.delegate = color
p.work() //彩色打印機
- 注意點:代理屬性朴摊,一般都是使用weak修飾
- weak修飾的必須是類類型對象
- 所以一般要求協(xié)議繼承自NSObjectProtocol/class
- 協(xié)議繼承自class:
protocol WPrint:class{
func test()
}
class BlackPrint:WPrint{
func test() {
print("黑白打印機")
}
}
class ColorPrint:WPrint{
func test() {
print("彩色打印機")
}
}
class Person1{
weak var delegate:WPrint?
func work(){
delegate?.test()
}
}
let p = Person1()
let black = BlackPrint()
let color = ColorPrint()
p.delegate = black
p.work() //黑白打印機
p.delegate = color
p.work() //彩色打印機
- 協(xié)議繼承自NSObjectProtocol
protocol WPrint:NSObjectProtocol{
func test()
}
class BlackPrint:NSObject,WPrint{
func test() {
print("黑白打印機")
}
}
class ColorPrint:NSObject,WPrint{
func test() {
print("彩色打印機")
}
}
class Person1{
weak var delegate:WPrint?
func work(){
delegate?.test()
}
}
let p = Person1()
let black = BlackPrint()
let color = ColorPrint()
p.delegate = black
p.work() //黑白打印機
p.delegate = color
p.work() //彩色打印機
三、協(xié)議中的可選
- 注意點:
- 在Swift中此虑,如果遵循了一個協(xié)議甚纲,必須要實現(xiàn)協(xié)議里面所有的方法;
- OC中協(xié)議里面的方法有可選朦前。
- 使用:
- 使用@objc修飾協(xié)議介杆;
- 使用@objc optional修飾方法。
3.實踐:
@objc
protocol Work{
@objc optional func test()
}
class Person:Work{
}
let p = Person()
p.test() //報錯况既,找不到test方法