协议(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. DIV 居中对齐

    <div style="text-align:center;margin-right:auto;margin-left:auto">

  2. Microsoft Build 2016 Day 2

    Microsoft Build 2016 Day 2 Microsoft Build 2016 Day 1 记录 Microsoft Build 2016 进行到了第二天,我觉得这一天的内容非常精彩, ...

  3. hdu3452 无向树去掉最小的边集使不论什么叶子与根不连通 / 最小割

    思路一下就上来了,叶子向汇点连边,inf保证不会成为割,跑根到汇点最小割就可以.注意无向树双向建边.基础题,分分钟1A: #include<iostream> #include<qu ...

  4. SQL:多表关联采取这一纪录迄今为止最大

    笔者:iamlasong 1.需求 两个表,投递记录表和封发开拆记录表,如今想知道投递日期距最后一次封发日期天数分布情况. 对这个需求,须要先查询出投递明细,同一时候要知道相应的邮件最后一次封发情况. ...

  5. 【原创】leetCodeOj --- Sliding Window Maximum 解题报告

    天,这题我已经没有底气高呼“水”了... 题目的地址: https://leetcode.com/problems/sliding-window-maximum/ 题目内容: Given an arr ...

  6. 一起学习android图片四舍五入图片集资源 (28)

    效果图: 參看下面代码: public class MainActivity extends Activity { private ImageView imageView1; private Imag ...

  7. SSH三作品的框架和流程

    Hibernate工作的,为什么? 原理: 1.通过Configuration().configure();读取并解析hibernate.cfg.xml配置文件 2.由hibernate.cfg.xm ...

  8. C#读取excel等表格常用方法

    0. 利用NPOI. 请查阅此插件的相关文档. 1.方法一:采用OleDB读取EXCEL文件: 把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下: 1 2 3 4 5 6 7 8 9 10 ...

  9. Android 内存泄漏优化汇总

    android内存泄漏优化摘要 博客分类: android android内存溢出OutOfMemoryError . android移动应用程序的内存分配一般是8凯瑟琳约,不正确地假定处理内存处理非 ...

  10. Interpolator(插值器)的种类

    Interpolator(插值器)的种类 Interpolator被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeat ...