20.Swift学习之协议

协议

协议为方法、属性、以及其他特定的任务需求或功能定义一个大致的框架。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足了协议中需求的任意类型都叫做遵循了该协议。

协议的格式

  • 协议的定义方式与类,结构体,枚举的定义都非常相似
protocol SomeProtocol {
    // 属性
    // 方法
}
  • 协议中的属性
    • 不可以有默认值
    • 必须设置是{get}或者{get set} ,注意:get与set之间是没有逗号的
    • 必须设置为var
  • 协议中的方法
    • 可以定义普通方法也可以是mutating方法
    • 方法不能有方法体
    • 方法的参数不可以有默认值
protocol Pet {
    // 定义属性
    var name: String {get set}
    var age: String {get}
    // 定义方法
    func feed(food: String)
    mutating func shout(sound :String);
}
  • 遵守协议的格式
class SomeClass: SomeSuperClass, FirstProtocol, AnotherProtocol {
    // 类的内容
    // 实现协议中的方法
}
  • 实现协议中的属性
    • 此时属性可以设置默认值
    • 协议中属性为可读可写的,可以直接声明为var类型就可以
    • 协议中属性为可读属性,可以直接声明为let类型就可以,也可以声明为var类型
  • 实现协议中的方法
    • 可以为方法中的参数设置默认值
    • 在结构体中,如果需要改变自身的值,需要在方法前面加mutating关键字。在协议的方法中添加mutating关键字,如果结构体来遵守协议,需要有mutating这个关键字,如果是类来遵守协议,mutating关键字就不需要了。

协议的基本使用

  • 定义协议和遵守协议
// 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 {
    func buyTicket()
}
class Person {
    // 1.定义协议属性
    var delegate : BuyTicketProtocol

    // 2.自定义构造函数
    init (delegate : BuyTicketProtocol) {
        self.delegate = delegate
    }

    // 3.行为
    func goToBeijing() {
        print("找黄牛买票")
        delegate.buyTicket()
        print("拿到票去北京")
    }
}
class HuangNiu: BuyTicketProtocol {
    func buyTicket() {
        print("黄牛帮忙买了一张火车票")
    }
}
let p = Person(delegate: HuangNiu())
p.goToBeijing()

协议中方法的可选

方法一
  • 定义协议
@objc protocol SportProtocol {
    func playBasketball()
    optional func playFootball()
}
  • 遵守协议
class Person : SportProtocol {
    var name : String?
    var age : Int = 0
    // 实现协议中的方法
    @objc func playBasketball() {
        print("人在打篮球")
    }
}
方法二

扩展协议

protocol SomeProtocol {
    func requiredFunc()
    func optionalFunc()
}
extension SomeProtocol {
    func optionalFunc() {
      print("optionalFunc扩展中实现")
    }
}

Class SomeClass: SomeProtocol {
    func requiredFunc() {
      print("requiredFunc具体类中实现")
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏DOTNET

asp.net web api 异常捕获

1 向客户端发送错误消息 使用throw new HttpResponseException()向客户端抛出错误信息。 HttpResponseExceptio...

51612
来自专栏PHP在线

php日常使用总结

Private(私有): 只能在这个当前类的内部读取、修改。 Protected(受保护):能够在这个类和类的子类中读取和修改。 在方法内部通过 $this...

3708
来自专栏LeoXu的博客

ActionScript语言基础 原

ActionScript支持比JavaSctipt所支持的更新的ECMAScript标准实现版本。

642
来自专栏Brian

Python With-As

深入理解Python的With-as语句 ---- 学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,...

9977
来自专栏ShaoYL

iOS 声明属性关键字讲解

35917
来自专栏IT可乐

Spring详解(三)------DI依赖注入

  上一篇博客我们主要讲解了IOC控制反转,也就是说IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给s...

2015
来自专栏Java 源码分析

Bootstrap 源码分析

Netty 源码分析: Bootstrap 1. 结构 先看一个这个类的类层次结构, ? 好,这个结构还是比较明晰的,然后看他的主要字段,因为这些字段比较重...

3042
来自专栏哲学驱动设计

模式应用:自定义匹配

    本篇博客记录了我在工作过程中的一个设计单元。 需求 GIX4项目中需要为非国标清单进行匹配,用户自定义匹配规则。规则可以被存储到数据库中,下次重复使用...

2015
来自专栏Java编程技术

什么是重排序与中断

Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的指令进行重排序,...

822
来自专栏coolblog.xyz技术专栏

Dubbo 源码分析 - 集群容错之 Router

上一篇文章分析了集群容错的第一部分 -- 服务目录 Directory。服务目录在刷新 Invoker 列表的过程中,会通过 Router 进行服务路由。上一篇...

1041

扫码关注云+社区

领取腾讯云代金券