二十、协议 Protocols

1. 概述

协议只提供方法的声明,不提供实现。协议可以被类、结构体和枚举实现。

2. 协议的语法 Protocol Syntax

定义一个协议:

    protocol SomeProtocol {
      // protocol definition goes here
    }

如果一个类有某个父类或是需要遵守某个协议,将父类或协议写在冒号后面:

    class SomeClass: SomeSuperclass, FirstProtocol, AnotherProtocol {
      // class definition goes here
    }

3. 属性的要求 Property Requirements

4. 方法的要求 Method Requirements

协议中方法的参数不能有默认值。

在协议中,用 class 表示类方法,用 static 表示结构体方法和枚举方法(静态方法)。

    protocol SomeProtocol {
      class func someTypeMethod()
    }

比如,在协议中定义一个实例方法:

    protocol RandomNumberGenerator {
      func random() -> Double
    }

类 LinearCongruentialGenerator 实现了上面的协议:

    class LinearCongruentialGenerator: RandomNumberGenerator {
      var lastRandom = 42.0
      let m = 139968.0
      let a = 3877.0
      let c = 29573.0
      func random() -> Double {
        lastRandom = ((lastRandom * a + c) % m)
        return lastRandom / m
      }
    }
    let generator = LinearCongruentialGenerator()
    println("Here‘s a random number: \(generator.random())")
    // prints "Here‘s a random number: 0.37464991998171"
    println("And another one: \(generator.random())")
    // prints "And another one: 0.729023776863283"

5. 可变方法的要求 Mutating Method Requirements

十、方法 Methods我们知道,在值类型(结构体和枚举)中,如果如果方法想要修改自己的那个实例,需要定义为 mutating 类型。

如果某个协议中的方法,需要修改实现了这个协议的实例的值,应该将方法定义为mutating 类型。这就是的实现了这个协议的枚举和结构体可以修改自己的实例本身。

注意:在类中,不需要写mutating关键字,mutating关键字为值类型专用。

定义一个协议:

    protocol Togglable {
      mutating func toggle()
    }

值类型OnOffSwitch 需要实现这个协议:

    enum OnOffSwitch: Togglable {
      case Off, On
      mutating func toggle() {
        switch self {
          case Off:
            self = On
          case On:
            self = Off
        }
      }
    }
    var lightSwitch = OnOffSwitch.Off
    lightSwitch.toggle()
    // lightSwitch is now equal to .On

6. 构造器的需求 Initializer Requirements

时间: 2024-10-28 14:30:02

二十、协议 Protocols的相关文章

马哥学习笔记二十五——ISCSI协议,架构及其安装配置

ISCSI监听在tcp/3260端口 iSCSI Target:iscsi-target-utils 客户端认正方式: 1.基于IP 2.基于用户,CHAP tgtadm:命令行工具,模式化命令 --mode 常用模式:target,logicalunit,account target --op new.delete.show.update.bind.unbind logicalunit --op new.delete account --op new.delete.bind.unbind --

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装

第三百二十三节,web爬虫,scrapy模块以及相关依赖模块安装 当前环境python3.5 ,windows10系统 Linux系统安装 在线安装,会自动安装scrapy模块以及相关依赖模块 pip install Scrapy 手动源码安装,比较麻烦要自己手动安装scrapy模块以及依赖模块 安装以下模块 1.lxml-3.8.0.tar.gz (XML处理库) 2.Twisted-17.5.0.tar.bz2 (用Python编写的异步网络框架) 3.Scrapy-1.4.0.tar.gz

实验二十四:SD卡模块

  驱动SD卡是件容易让人抓狂的事情,驱动SD卡好比SDRAM执行页读写,SD卡虽然不及SDRAM的麻烦要求(时序参数),但是驱动过程却有猥琐操作.除此此外,描述语言只要稍微比较一下C语言,描述语言一定会泪流满面,因为嵌套循环,嵌套判断,或者嵌套函数等都是它的痛.. 史莱姆模块是多模块建模的通病,意指结构能力非常脆弱的模块,暴力的嵌套行为往往会击垮模块的美丽身躯,好让脆弱结构更加脆弱还有惨不忍睹,最终搞垮模块的表达能力.描述语言预想驾驭SD卡,关键的地方就是如何提升模块的结构能力.简单而言,描述

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

企业搜索引擎开发之连接器connector(二十五)

下面开始具体分析连接器是怎么与连接器实例交互的,这里主要是分析连接器怎么从连接器实例获取数据的(前面文章有涉及基于http协议与连接器的xml格式的交互,连接器对连接器实例的设置都是通过配置文件操作的,具体文件操作尚未详细分析(com.google.enterprise.connector.persist.FileStore类)) 本文以数据库连接器实例为例来分析,数据库类型连接器是通过调用mybatis(sqlmap框架)组件与数据库进行操作的,我们通过前端提交的数据库连接器实例表单信息最终存

swift 笔记 (二十) —— 泛型

泛型 泛型是为了解决在针对不同数据类型,而做了同一种功能的操作导致的每个类型我们都要写一份代码的问题. 有了泛型,我们可以只写一份逻辑代码,而适应于不同的数据类型. func swapInt(inout num1:Int, inout num2: Int) { var tmp = num1 num1 = num2 num2 = tmp } func swapDouble(inout num1: Double, inout num2:Double) { var tmp = num1 num1 =

CCNA实验二十四 路由更新的安全  

CCNA实验二十四 路由更新的安全 环境: Windows XP .GNS3.0.7.2 目的: 学会如何通过MD5 认证和被动端口保护路由更新,注意这两种方法在EIGRP .OSPF. RIP.IGRP等路由协议中都能用. 说明: MD5认证:通过邻居路由器之间的路由更新认证来防止无效的路由更新可能对网络造成的威胁和破坏. 被动接口:能够防止不必要的路由更新进入某个网络,可以禁止向不在安全管理范围的网段通告路由起到安全的作用,并且还能阻止EIGRP,OSPF,ISIS的HELLO包的通过.此外

CCNA实验二十五 实战多种ACL访问控制  

CCNA实验二十五 实战多种ACL访问控制 环境:Windows XP .Pracket Tracert 5.3 . GNS3.0.7.2 目的:了解ACL作用并熟练在不同环境中配置ACL 说明: ACL是路由器和交换机接口的指令列表,用来控制端口进出的数据包并且可以保护网络,ACL适用于所有的被路由协议,如IP.IPX.AppleTalk等.ACL种类:标准ACL.扩展ACL.命名式ACL.基于时间ACL.自反ACL.动态ACL. 标准的ACL使用 1 ~ 99 以及1300~1999之间的数

CCNA实验二十八 帧中继(Frame Relay)  

CCNA实验二十八 帧中继(Frame Relay) 环境: Windows XP. GNS3.0.7.2 目的:了解如何配置帧中继 说明: 帧中继(Frame Relay, FR)是一种用于连接计算机系统的面向分组的通信方法,也是面向连接的第二层传输协议,帧中继是典型的包交换技术.用户经常需要租用线路把分散在各地的网络连接起来,如果采用点到点的专用线路(例如 DDN),ISP 需要给每个地方的路由器拉 4对物理线路,同时每个路由器需要有 4 个串口.而使用帧中继每个路由器只通过一条线路连接到帧

QT开发(二十八)——QT常用类(二)

QT开发(二十八)--QT常用类(二) 一.QDir 1.QDir简介 QDir提供对目录结构及其内容的访问. QDir通过相对或绝对路径指向一个文件. 2.QDir成员函数 QDir主要成员函数如下: QDir::QDir ( const QDir & dir ) QDir::QDir ( const QString & path = QString() ) Dir::QDir ( const QString & path, const QString & nameFil