协议定义了适合某个特定任务或功能须要的方法、属性和其他需求的一个蓝图。协议本身不提供这些需求的实现,它仅仅是描写叙述了一个任务或功能实现的蓝图。

协议与java 语言中的接口定义类似,都是描写叙述了一个实现能够干什么,而本身却不包括不论什么实现。与接口不同的是swift语言定义的协议能够被一个类、结构、或者枚举採用,来提供协议规定需求的实际实现,而java 语言的接口仅仅能被类实现。

满足一个协议需求的不论什么类型(即实现了该协议规定需求)被称为符合该协议。

协议中规定的需求能够是实例属性、实例方法、类型方法、操作符、下标方法等。

1.1 协议语法

协议的定义语法与类、结构和枚举类型类似。以protocolkeyword来指示一个协议。并在大括号里规定协议的每个需求。

protocol SomeProtocol {

// protocol definition goes here

}

一个採用某些协议的特定类型在定义中声明它採用的协议,语法例如以下:

struct SomeStructure:
FirstProtocol, AnotherProtocol {

// structure definition goes here

}

与接口类似,某个类型能够採用(符合)多个协议。类型採用的每一个协议之间用逗号来切割。类型名与协议名之间用冒号切割。

假设一个类有超类,把它的超类名放在它採用的协议名前面,并以一个逗号切割:

class SomeClass: SomeSuperclass,FirstProtocol,AnotherProtocol {

// class definition goes here

}

1.2  协议需求项定义

1) 属性需求

一个协议中的一个属性需求仅对须要属性的属性名和类型进行规定,而不规定这些属性是否是一个存储属性或者是一个计算属性。因此仅仅要一个类型提供一个和该属性需求规定的属性名和类型同样的一个实例属性或者一个类型属性,则该类型就符合该协议规定的这条属性需求。

协议的属性需求也必须规定每一个属性是仅仅读的或者是可读写的。

假设一个协议中一个属性需求规定是可读写的,那么该属性需求不能被一个常量存储属性或者一个仅仅读的计算属性满足。假设协议的一个属性需求规定是仅仅读的。那么该属性需求能被不论什么种类的属性满足。

协议中的属性需求总是作为变量属性被声明(var)。可读写属性通过在类型声明后面加入{ get set }来指示,可读属性用{ get }来指示。协议中的实例属性需求规定例如以下:

protocol SomeProtocol {

var mustBeSettable:Int {getset }

var doesNotNeedToBeSettable:Int {get }

}

在协议中总是使用classkeyword来规定一个类型属性。无论採用该协议的可能是一个结构或枚举,而在该结构或枚举中却是使用static前缀来定义该类型属性,仅仅要该类型属性的其他方面满足协议中对该属性的规定。该属性就是符合协议需求的。

protocol AnotherProtocol {

class var someTypeProperty:Int {getset }

}

2) 方法需求

协议中使用与正常的方法同样的语法来规定一条方法需求,但不同意为方法參数规定默认值。

与属性规定同样,在协议中总是使用classkeyword来规定一个类型方法需求,无论採用该协议的一个结构或枚举是使用static前缀来定义该方法,仅仅要该方法的其他方面满足该协议对该方法的规定,其方法就是符合协议需求的。

协议的一条方法需求规定例如以下所看到的:

protocol SomeProtocol {

class fund someTypeMethod()

}

3) 变异方法需求

无论採用协议的是一个类,还是一个结构或枚举,协议总是使用mutatingkeyword来标示一个方法是变异方法。一个採用该协议的类的方法不使用mutatingkeyword来标示。

例如以下所看到的。协议中规定了一条变异方法需求。

protocol Togglable {

mutating functoggle()

}

4)协议中的选项需求

你也能在协议中定义选项需求,这些需求不须要被採用该协议的类型实现(能够实现,也能够不实现)。

选项需求使用@optionalkeyword来标示。

你能够使用选项链来检查一个选项需求是否被採用该协议的类型实现。

选项属性需求、返回一个值的选项方法需求在它们被存取或调用时总是返回一个适当类型的一个选项。

选项需求仅可以在一个使用@objc 属性进行标记的协议中规定,另外使用@objc 属性进行标记的协议仅能被类所採用。而不能被结构或枚举採用。

例如以下样例展示了协议中选项需求的定义,以及怎样使用选项链来使用协议中规定的选项:

@obj cprotocol CounterDataSource {

@optional func incrementForCount(count:Int)
->Int

@optional var fixedIncrement:Int {get }

}

该协议规定了一条选项方法,一条选项属性。

@objc class Counter {

var count =0

var dataSource:CounterDataSource?

func increment()
{

if let amount =dataSource?.incrementForCount?

(count)
{

count +=amount

}else if let amount =dataSource?

.fixedIncrement?

{

count +=amount

}

}

}

使用该协议的类Counter也用@objc标记,在该类中使用选项链来读取和调用协议中规定的选项属性和选项方法。

1.3 协议的类型

协议是一种类型。因此能够使用协议作为一个函数、方法或初始化方法中的參数类型或者返回类型。也能够作为一个常量、变量或属性的类型。也能够作为一个数组、词典或其他容器中的项的类型。

因为协议是类型,因此它也可以使用is 和as操作符来检查协议的兼容性。可以使用is 操作符来检查一个实例是否採用了某个协议。使用as操作符来转换一个协议到它的继承链上的另外的协议。

与协议的选项需求规定类似,使用以上操作来检查协议的兼容性也须要协议使用@objc 属性进行标记,另外使用@objc 属性进行标记的协议仅可以被类採用,而不能被结构或枚举採用。

1.4 用扩展来採用协议

可以使用扩展来扩展某个类型(即使已经存在)。使该类型採用和符合一个新协议。

在扩展中实现新协议规定的方法、属性和下标。

扩展后的类型扩展前的已存在的实例也自己主动获得协议规定的能力。

语法例如以下:

extension ExistType:NewProtocol {

// protocol implementation goes here

}

一个已经实现某个协议全部需求的类型假设不明白声明採用该协议。那么它不自己主动採用那个协议。一个类型採用某个协议。必须被声明。

能够使用一个空的扩展来明白地声明已实现某个协议全部需求的类型採用这个协议。

extension ExistType: NewProtocol {}

1.5 协议的继承

与接口同意继承同样,协议也可以继承。

协议可以继承一个或多个其他的协议。使一个协议在它继承的协议基础上添加进一步的需求。协议继承的语法例如以下:

protocol InheritingProtocol:SomeProtocol,AnotherProtocol {

// protocol definition goes here

}

1.6  协议的复合

在使用协议作为类型使用时。你可以组合多个协议作为一个暂时类型使用,语法为:

protocol<SomeProtocol, AnotherProtocol>,在三角括号内列出要组合的多个协议,每一个协议间用逗号切割。

例如以下样例展示了使用协议组合作为一个函数參数类型的使用方法。

protocol Named {

var name:String {get }

}

protocol Aged {

var age:Int {get }

}

struct Person:Named,Aged {

var name:String

var age:Int

}

func wishHappyBirthday(celebrator:protocol<Named,Aged>)
{

println("Happy birthday\(celebrator.name) -
you're \(celebrator.age)!")

}

let birthdayPerson =Person(name:"Malcolm",age:21)

wishHappyBirthday(birthdayPerson)

协议复合未定义一个新的协议,而仅仅是暂时组合多个协议作为一个暂时协议类型使用。

版权全部,请转载时清楚注明链接和出处。谢谢。

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

苹果公司的新的编程语言 Swift 高级语言(十五)--协议的更多相关文章

  1. 苹果公司的新的编程语言 Swift 高级语言(十一)--初始化类的析构函数的一个实例

    一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程. 初始化包含设置一个实例的每个存储属性为一个初始值,以及运行不论什么其他新的实例可以使用之前须要的设置或 ...

  2. 苹果公司的新的编程语言 Swift 高级语言()两--基本数据类型

    一  .   常量和变量 Swift语言 对常量和变量的声明进行了明白的区分 Swift语言的常量类型比C 语言的constants类型更加强大,语义更加明白. 常量和变量的差别是常量在设置或初始化后 ...

  3. 苹果新的编程语言 Swift 语言进阶(十五)--协议

    协议定义了适合某个特定任务或功能需要的方法.属性和其它需求的一个蓝图.协议本身不提供这些需求的实现,它只是描述了一个任务或功能实现的蓝图. 协议与java 语言中的接口定义类似,都是描述了一个实现可以 ...

  4. 苹果新的编程语言 Swift 语言进阶(十六)--泛型

    泛型允许你定义一个宽松.可重用的函数或者类型,使用泛型能够避免代码的重复,也能以更清楚和抽象的方式来表达程序的意图. 泛型是Swift语言提供的强大功能之一,Swift提供的许多标准库都使用了泛型来创 ...

  5. 苹果新的编程语言 Swift 语言进阶(一)--综述

    Swift 是苹果开发和提供的供开发IOS 和OS X应用的一门新的语言.Swift语言基于C 和Objective-C语言,除了提供C 和Objective-C语言具有的所有语法功能外,为了编程方便 ...

  6. 苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算

    一 基本操作运算 1. 赋值操作 在Swift 中,能够使用赋值操作为一个常量或一个变量赋值,也能够使用多元组一次为多个常量或变量赋值. Swift 的赋值操作与其他语言最大的不同是赋值操作除了可以为 ...

  7. 苹果新的编程语言 Swift 语言进阶(十四)--扩展

    扩展是为一个已经存在的类.结构.枚举类型添加新功能的一种方式,包括为不能存取源代码的那些已经存在的类型添加功能. 扩展类似于Objective-C语言中的类别,与类别不同的是Swift语言的扩展没有名 ...

  8. 苹果新的编程语言 Swift 语言进阶(十一)--实例的初始化与类的析构

    一 .实例的初始化          实例的初始化是准备一个类.结构或枚举的实例以便使用的过程.初始化包括设置一个实例的每一个存储属性为一个初始值,以及执行任何其它新的实例能够使用之前需要的设置或初始 ...

  9. 苹果新的编程语言 Swift 语言进阶(十)--类的继承

    一.类的继承 类能够从其它类继承方法.属性以及其它特性,当一个类从另外的类继承时,继承的类称为子类,它继承的类称为超类.在Swift中,继承是类区别与其它类型(结构.枚举)的基础行为. 1.1 .类的 ...

随机推荐

  1. CIC and Fir 滤波器的级联

    在FDATool中 CIC 和 Fir 级联滤波器的设计 1 设计CIC滤波器的幅频特性曲线如下 2.设计FIR 滤波器的幅频特性曲线如下 3.总的特性曲线如下 4.把通带部分放大后的图,比较平坦

  2. Cocos2d-X中的坐标系

    在Cocos2d-x中坐标能够分成四种: 1.GL坐标体系:GL坐标体系左下角为坐标原点,X轴向右,Y轴向上 2.UI坐标体系:UI坐标体系左上角为坐标原点,X轴向右,Y轴向上. .世界坐标体系:是窗 ...

  3. (大数据工程师学习路径)第三步 Git Community Book----Git介绍

    一.git诞生 同生活中的许多伟大事件一样,Git 诞生于一个极富纷争大举创新的年代.1991年,Linus创建了开源的Linux,并且有着为数众多的参与者.虽然有世界各地的志愿者为Linux编写代码 ...

  4. react.js 从零开始(三)JSX 语法及特点介绍

    什么是jsx? jsx = JavaScript + xml jsx 是一种 Ecmascript 的一种新标准. jsx 是一种 带有结构性的语法. jsx 的特点: 1.类xml语法易于理解. 2 ...

  5. VS2013打包部署(图解)

    首先要说明的是VS解决方案的配置Debug模式和Release有什么区别模式.Debug模式通常被称为调试模式,它包括调试信息,不优化的代码,序:Release模式通常叫做公布模式.不包括调试信息,可 ...

  6. 编译器神vim改头换面

    我相信,农民听到两件神器码,首先emacs,首先vim.大家都知道e党和v党总是吵架.竟,这无助于嘈杂.只是每个人都有自己的道理也适用.在接触vim,同时联系emacs.对于作家,我认为vim更适合. ...

  7. shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、功能、select

    1.expr计算整数变量值 s=`expr 2 + 3` 运算符号和參数之间要有空格分开: 2.let命令 let s=(2+3)*4 echo $s 3.for语句 for 变量 in 列表 do ...

  8. NPOI实现Excel导入导出

    NPOI实现Excel的导入导出,踩坑若干. Cyan是博主[Soar360]自2014年以来开始编写整理的工具组件,用于解决现实工作中常用且与业务逻辑无关的问题. 什么是NPOI? NPOI 是 P ...

  9. RPC框架

    RPC框架实现 - 路由控制篇 2015-04-27 22:26 by bangerlee, 499 阅读, 1 评论, 收藏, 编辑 RPC(Remote Procedure Call,远程过程调用 ...

  10. 编程算法 - 切割排序 代码(C)

    切割排序 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 排序切割, 把一个数组分为, 大于k\小于k\等于k的三个部分. 能够使用高速排序的Parti ...