20 协议

作者: 猴子的救兵520 | 来源:发表于2017-07-05 19:32 被阅读60次

协议的格式

  • 协议的定义方式与类,结构体,枚举的定义都非常相似
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()
        
    }

}

其他资料

Swift中的Protocol知道这些就够了

相关文章

  • Swift 5.1 (20) - 协议

    Swift 5.1 (20) - 协议Swift 5.1 (20) - 协议

  • 20 协议

    协议的格式 协议的定义方式与类,结构体,枚举的定义都非常相似 遵守协议的格式 协议的基本使用 定义协议和遵守协议 ...

  • 【区块链基础06】-ERC20协议

    1、什么是ERC20协议? ERC20是一个基于以太坊(Etherenum)代币(Token)的接口标准(协议)。...

  • 常见端口号

    FTP:20/21 文件传输协议SSH:22 安全shell协议TELNET:23 远程登陆协议DNS:53...

  • 软件测试的转化篇,万事从基础开始

    常见的服务和默认端口、协议: http(超文本传输协议):80 FTP(文件传输协议):20、21 Smtp:25...

  • 以太坊平台相关的STO协议1

    STO相关ERC协议 1.1 ERC-20 Token标准协议 是Token的标准接口。ERC-20标准定义了一套...

  • 网络相关知识

    一,常用协议与端口 FTP 文件传输协议,20传输数据,21控制telnet 远程控制协议 23smtp 简单...

  • 常用端口号

    20:FTP数据端口 文件传输协议21:FTP控制端口23:Telnet 远程终端协议25:SMTP 简单邮件传...

  • 简单了解TCP/IP模型

    什么是 TCP/IP 模型? TCP/IP(传输控制协议/互联网协议)由DARPA在 20 世纪 70 年代提出。...

  • Swift 5.1 (20) - 协议

    协议定义了适合特定任务或功能的方法,属性。协议可以由类,结构或枚举实现,任何类型实现协议的要求方法称为遵守协议。个...

网友评论

      本文标题:20 协议

      本文链接:https://www.haomeiwen.com/subject/yozlcxtx.html