协议(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. WPF与混淆器

    原文:WPF与混淆器 时至今日,混淆依然是.Net程序的一道重要保护手段,而混淆器对WPF应用程序的支持是怎样的呢?我们今天就通过实例讲解一下. 首先建立如下图所示的简单的用户界面: 在界面代码中设置 ...

  2. 【C/C++】BinarySearch

    /* * BinarySearch.c * * Created on: 2014年6月25日 * Author: wenbo */ #include <stdio.h> int binar ...

  3. 【教你zencart仿站 文章1至6教训 高清1280x900视频下载】[支持手机端]

    [教你zencart仿站 第1至6课 高清晰1280x900视频下载][支持移动端] 经过筹备, 我们的课件最终出来了- 我们 zencart联盟合伙人 项目推出的 在线yy同步演示zencart仿站 ...

  4. 使用Hamcrest增强JUnit的测试能力

    package com.jadyer.service; import java.util.HashMap; import java.util.Map; import org.hamcrest.Matc ...

  5. 【python下使用OpenCV实现计算机视觉读书笔记4】保存摄像头视频

    读取摄像头内容,然后保存一段十秒钟的视频. import cv2 cameraCapture = cv2.VideoCapture(0) fps = 30 # an assumption size = ...

  6. jquery的attr禁用表单元素的方法

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. iOS Crash获取闪回日志和上传server

    首先我们整理常常会闪退的异常哪些:数组越界.空引用.引用没有定义方法.内存空间不足等等. 怎样获取crash闪退日志 -- 工具查看 先看第一个问题怎样查看,我搜索的方法有下面几个: 第一个方法:XC ...

  8. uva 1331 - Minimax Triangulation(dp)

    option=com_onlinejudge&Itemid=8&page=show_problem&category=514&problem=4077&mosm ...

  9. centos7安装并配置svn(转)

    一.安装 1. 通过 yum install subversion来安装 2. 查看svn版本 使用: svnserve –version 3. 创建svn版本库 使用命令: svnadmin cre ...

  10. poj Firing(最大重量封闭图)

    Firing 题目: 要解雇一些人,而解雇的这些人假设人跟他有上下级的关系,则跟他有关系的人也要一起解雇.每一个人都会创造一定的价值,要求你求出在最大的获利下.解雇的人最小. 算法分析: 在这之前要知 ...