协议(Protocols)


协议仅是用定义某些任务或者是功能必须的方法和属性。

类似于java里的interface的作用。但协议并不会实现详细的功能。


我猜这个名字源于OO中提到的“契约”。但我并不认为这名字非常好,反而是interface这名字更容被接受。由于我认为协议这个名字非常easy和网络编程的时候的网络协议搞混,网络协议也通常简称为协议。

语法:
protocol MyProtocol {
     //协议定义
}

struct MyStruct: MyProtocol1, MyProtocol2 {
     …...
}

class MyClass: MyBaseClass, MyProtocol {
     …...
}

协议写得与继承没有什么区分,所以这种话。我们是不是就须要把协议的名字专门加上xxxxProtocol以区分究竟是继承还是协议,以便让别人一眼就看明确。

。。。。

唉,无奈的语法


protocol MyClassProtocol {

    class var num:Int {get}    //get表示仅仅读属性

}



struct MyStruct : MyClassProtocol {     //编译器会提示
                                       //Type’MyStruct’ does not 
                                       //conform to protocol ‘MyClassProtocol'

   

}

协议中写了class。说明num是一个类成员,所以不能用在struct上,假设要用在struct中的话,要写为static,这一点,与前面说的类属性和结构体属性一章的内容一致。


可是非常有趣的一点是,对于protocol来说,他本该是一条严格的规则。全部的条目必须满足它的规定,然而,并不尽然。比如上面的{get},这样并没写set方法的话,意思为仅仅读,可是,我们依旧能够在类的实现中写出set方法(必须提供get)。可是假设不定义num的实现就不行。所以protocol并不严格。我们就仅仅把它理解为“至少满足”的条件好了。

方法的定义事实上也一样:
protocol MyProtocol {
     class func myMethod()          //类方法
}

protocol MyProtocol {
     func myMethod() -> Int          //实例方法
}

protocol MyMutating {
     mutating func myMethod()     //突变方法(结构体,枚举)
}

协议类型
如今除了基本类型,枚举。结构体,类,我们又多了一种类型。协议。

协议能够作为函数的參数。返回值。常量。变量等等。。。

protocol MyClassProtocol {

    var num:Int {get}

}



class MyClass1:MyClassProtocol {

    var num:Int = 1

    var name = "class1"

}



class MyClass2 :MyClassProtocol {

    var num:Int = 2

    var typeName = "MyClass2"

}



class MyTestClass {

    var handle:MyClassProtocol     //作为变量类型

    

    init(handle:MyClassProtocol){
    //作为函数參数

        self.handle = handle

    }

}



var c1 = MyClass1()

var c2 = MyClass2()



var t1 = MyTestClass(handle: c1)

var t2 = MyTestClass(handle: c2)

在这个样例中,能够看出,handle更像是一个多态的应用,他能够接受不论什么一个满足MyClassProtocol协议的实例作为变量值。


代理
事实上如今还用了非常多设计模式,都没有被拿出来说,然而这个模式却要拿出来强调。或许是和苹果的UI设计架构有非常大关系。
事实上这块就是在讲,swift希望我们怎样来实现多态。不多说了。

协议继承
这个跟类继承非常像:
protocol MyProtocol: MyProtocol1, MyProtocol2{

}

协议组合
假设我们须要让參数的类型同一时候支持非常多个协议的话。我们就能够用协议的组合。能够通过protocol<MyProtocol1, MyProtocol2>的形式来完毕协议的组合.

官方的样例:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3VwZXJnZXJt/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


协议一致性检查
在之前笔记中,我们使用 is 和 as 对类的实例类型进行检查和转换,如今我们也能够用这两个操作符对协议进行操作。所以,不须要再反复的举例了。
(事实上本质上与类中的操作无不论什么差别。由于协议无非就是类定义的一种特殊形式罢了。非要说结构体的话,那么它也是结构体定义的一种特殊形式,以及枚举。)

可选协议
@objc protocol MyProtocol {          //@objc 说明这协议是可选的
     @optional func myFunc()         //@optional 指出这种方法是可选的
     @optional var myNum:Int {get}   //          指出这个变量是可选的
}

可选我们已经说过太多了,仅仅要知道这个就能够了,也不用举例了。


版权声明:本文博客原创文章,博客,未经同意,不得转载。

swift 笔记 (十九) —— 协议的更多相关文章

  1. python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法

    python3.4学习笔记(十九) 同一台机器同时安装 python2.7 和 python3.4的解决方法 同一台机器同时安装 python2.7 和 python3.4不会冲突.安装在不同目录,然 ...

  2. (C/C++学习笔记) 十九. 模板

    十九. 模板 ● 模板的基本概念 模板(template) 函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 语法: template <<模 ...

  3. swift 笔记 (十八) —— 扩展

    扩展 扩展能够让我们给一个已有的类.结构体.枚举等类型加入�新功能,包含属性和方法,甚至是构造器,下标,支持协议等等... 甚至是我们拿不到源码的类.结构体.枚举,我们依旧能够给它加扩展... 看到这 ...

  4. swift 笔记 (十二) —— 下标

    下标 swift同意我们为 类.结构体,枚举 定义下标,以更便捷的方式訪问一大堆属性.比方Array和Dictionary都是结构体,swift的project师已经为这两个类型提供好了下标操作的代码 ...

  5. swift 笔记 (十四) —— 构造过程

    构造过程 为了生成类.结构体.枚举等的实例,而做的准备过程,叫做构造过程. 为了这个过程,我们一般会定义一个方法来完毕,这种方法叫做构造器.当然它的逆过程,叫做析构器,用于在实例被释放前做一些清理工作 ...

  6. JavaScript权威设计--跨域,XMLHttpRequest(简要学习笔记十九)

    1.跨域指的是什么? URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a. ...

  7. python 学习笔记十九 django深入学习四 cookie,session

    缓存 一个动态网站的基本权衡点就是,它是动态的. 每次用户请求一个页面,Web服务器将进行所有涵盖数据库查询到模版渲染到业务逻辑的请求,用来创建浏览者需要的页面.当程序访问量大时,耗时必然会更加明显, ...

  8. SharpGL学习笔记(十九) 摄像机漫游

    所谓的摄像机漫游,就是可以在场景中来回走动. 现实中,我们通过眼睛观察东西,身体移动带动眼睛移动观察身边的事物,这也是在漫游. 在OpenGL中我们使用函数LookAt()来操作摄像机在三维场景中进行 ...

  9. Java笔记(十九)……多线程

    概述 进程: 是一个正在执行中的程序 每一个进程执行都有一个执行顺序,该执行顺序是一个执行路径,或者叫一个控制单元 线程: 就是进程中的一个独立的控制单元,线程在控制着进程的执行 一个进程中至少有一个 ...

随机推荐

  1. 工厂方法模式(factory method pattern)

    工厂方法模式相对于简单工厂模式的长处是为了更好的拓展,当假设再新加一种产品,对于简单工厂模式来说须要改动核心的工厂类,但对于工厂方法模式则不须要,在工厂方法模式中核心的工厂类不再负责创建全部产品的创建 ...

  2. 二叉树的建立与遍历(山东理工OJ)

    题目描写叙述 已知一个按先序序列输入的字符序列,如abc,,de,g,,f,,,(当中逗号表示空节点).请建立二叉树并按中序和后序方式遍历二叉树,最后求出叶子节点个数和二叉树深度. 输入 输入一个长度 ...

  3. SQL Server :理解数据页结构

    原文:SQL Server :理解数据页结构 我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或 ...

  4. Netty In Action中国版 - 第二章:第一Netty程序

    本章介绍 获得Netty4最新的版本号 设置执行环境,以构建和执行netty程序 创建一个基于Netty的server和client 拦截和处理异常 编制和执行Nettyserver和client 本 ...

  5. leetCode Min Stack解决共享

    原标题:https://oj.leetcode.com/problems/min-stack/ Design a stack that supports push, pop, top, and ret ...

  6. 开源 自由 java CMS - FreeCMS1.8 网上申报

    项目地址:http://code.google.com/p/freecms/ 在线申报 1. 转交申报 用户能够把申报转交给其它人办理,系统会记录此申报的转交记录. 注意:同一时候仅仅能转交一个申报. ...

  7. UVa 988 - Many Paths, One Destination

    称号:生命是非常多的选择.现在给你一些选择(0~n-1),和其他选项后,分支数每一次选择,选择共求. 分析:dp,图论.假设一个状态也许是选择的数量0一个是,代表死亡,计数的路径数将达到所有死亡可以去 ...

  8. Linux学习记录--命名管道通信

    命名管道通信 什么是命名管道 一个主要的限制是,它是匿名管道的应用还没有名字,因此,只有它可以用于进程间通信的方式与亲缘关系.在命名管道(named pipe或FIFO)提出后,该限制得到了克服.FI ...

  9. Android动画之二:View Animation

    作为一个博客<Android其中的动画:Drawable Animation>.android动画主要分为三大部分.上一篇博客已经解说Drawable Animation的使用方法,即逐帧 ...

  10. Windows Phone 8.1 新功能 - 应用栏控件

    2014年4月3日的微软Build 2014 大会上.Windows Phone 8.1 正式公布. 相较于Windows Phone 8.不论从用户还是开发人员的角度,都产生了非常大的变化. 接下来 ...