Swift入门教程17-协议(二)

原创Blog,转载请注明出处

http://blog.csdn.net/hello_hwc

本文主要补充上一篇文章中未提及的协议的功能

一、扩展中的协议

1、通过扩展来遵循协议

protocol TextProtocol {
	func asString() -> String
}
class ID{
	var ID:Int	 = 0
}
extension ID:TextProtocol{
	func asString()->String{
		return String(ID)
	}
}

2、通过扩展补充协议声明

class ID{
	var ID:Int = 0
	func asString()->String{
		return String(ID)
	}
}
extension ID:TextProtocol

二、协议类型可以保存在集合中

由于协议本身是一种类型,所以可以保存在集合类型中。

protocol HwcProtocol{
	func logDescription()
}
class Obj1:HwcProtocol{
	func logDescription(){
		println("From obj1")
	}
}
class Obj2:HwcProtocol{
	func logDescription(){
		println("From obj2")
	}
}
class Obj3:HwcProtocol{
	func logDescription(){
		println("From obj3")
	}
}
var obj1 = Obj1()
var obj2 = Obj2()
var obj3 = Obj3()
let things: [HwcProtocol] = [obj1,obj2,obj3]
for thing in things {
	println(thing.logDescription())
}

数组中的每个元素都是协议的遵循着,所以都会实现协议中的方法。

就可以这样调用

三、协议可以继承

与类相似,用冒号表示继承,多个继承用逗号隔开

protocol InheritingProtocol: SomeProtocol, AnotherProtocol {
// 协议定义
}

四、类专属协议

通过在第一个协议继承列表中添加class来表示协议只能被类实现

protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {
// class-only protocol definition goes here
}

五、协议合成

注意:协议合成并不会生成一个新的协议,在超出生命周期后会失效

protocol Named {
	var name: String { get }
}
protocol Aged {
	var age: Int { get }
}
struct Person: Named, Aged {
	var name: String
	var age: Int
}
//这里protocol<Named, Aged>表示同时遵循两个协议的类型
func wishHappyBirthday(celebrator: protocol<Named, Aged>) {
	println("Happy birthday \(celebrator.name) - you're \(celebrator.age)!")
}
let birthdayPerson = Person(name: "Malcolm", age: 21)
wishHappyBirthday(birthdayPerson)
// 输出 "Happy birthday Malcolm - you're 21

六、协议的一致性

三点规则

1、用is来判断实例是否遵循了某个协议

2、用as?来进行可选转换

3、用as来进行强制转换

七、可选协议的规定

用@optional 来声明某个方法或者属性可选实现

注意:可选协议只能在@objc前缀的协议中生效

@objc表示协议是可选的,并且表示可以暴露给Objective C,并且协议只对类有效

例如

@objc protocol 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
	}
	init(count:Int){
		self.count = count
	}
	}
}

声明一个计数器协议,然后功能类Counter完成技术,Counter有一个属性count用来返回当前的计数。

它保存了保存了这个协议类型作为接口,然后在increase方法中检查协议实现者实现了协议中哪个增加计数的方式,对应增加计数器。

然后,用户在使用Counter类的时候,选择性实现那种方法

class HwcTest:CounterDataSource{
	var counter:Counter
	init(counter:Counter){
		self.counter = counter;
		self.counter.dataSource = self;
	}
	var fixedIncrement = 10
	func hwcPrint(){
		for i in 1...10{
			println(counter.count)
			counter.increment()
		}
	}
}

同样,也可以使用

class HwcTest:CounterDataSource{
	var counter:Counter
	init(counter:Counter){
		self.counter = counter;
		self.counter.dataSource = self;
	}
	func incrementForCount(count: Int)->Int{
		return count+1
	}
	func hwcPrint(){
		for i in 1...10{
			println(counter.count)
			counter.increment()
		}
	}
}

时间: 2024-11-02 23:37:50

Swift入门教程17-协议(二)的相关文章

Swift入门教程:基本语法(二)

数字格式 数字可以增加额外的格式,使它们更容易阅读 可以增加额外的零 0 let money = 001999           // 1999 let money2 = 001999.000   // 1999.0 可以增加额外的下划线 _ ,以增强可读性 let oneMillion1 = 1_000_000    // 1000000 let oneMillion2 = 100_0000      // 1000000 let overOneMillion = 1_000_000.000

Swift中文教程(七)--协议,扩展和泛型

Protocols and Extensions 协议(接口)和扩展 Swift使用关键字protocol声明一个协议(接口): 类(classes),枚举(enumerations)和结构(structs)都可采用协议(protocol): 1 class SimpleClass: ExampleProtocol { 2 var simpleDescription: String = "A very simple class." 3 var anotherProperty: Int

【OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨)    微博:http://weibo.com/u/1723155442 知乎:http://www.zhihu.com/people/mao-xing-yun 邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.9 本篇文章中,我们将一起学习OpenCV中

Swift入门教程:基本语法大全

原文:Swift入门教程:基本语法大全       简介:                                                                                                                                                                                  什么是Swift                                  

Swift入门教程:基本语法(三)

打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播客iOS学院Swift教程") var name = "传智播客iOS学院\n" print(name) 输出其他数据类型 var age = 7 println(age) println("我今年\(age)岁") 元组类型 什么元组类型 元组类型由 N个

Swift入门教程:基本语法(一)

      简介:                                                                                       什么是Swift Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为"雨燕",右上角的图标就是它的LOGO 跟Objective-C一样,可以用于开发iOS.Mac应用程序 苹果从2010年7月开始设计Swift语言,耗时4年打造 Swift的语法特点

Swift入门教程18-代理Delegate

原创Blog,转载请注明出处 http://blog.csdn.net/hello_hwc 一 代理的理解 何为代理?顾名思义,代理就是把自己做的任务交给别人做.让代理遵循着监听到一些事件,实现一些数据源.做过IOS开发的都应该知道TableView有两个属性,delegate和dataSource.这就是代理最好的体现,tableView在设计之初并不知道这个tableView将来会放在哪里,存储的是什么东西,这里数据源就起到了关键性作用:对于设计者来说,我只要依据数据源来生成对应的视图,对于

Swift入门教程19-泛型

原创Blog,转载请注明出处 blog.csdn.net/hello_hwc 一 泛型的定义 和C++的类似,泛型定义了一种适用于任何类型的,可重用的代码,用一种抽象的方式来实现代码.Swift的Array和Dictionary都是用泛型来实现的,因为Array可以保存String类型的变量,也可以保存Int类型的. 举个例子 func swapTwoInts(inout a: Int, inout b: Int) { let temporaryA = a a=b b = temporaryA

Swift入门教程17-ARC与强弱引用

ARC 全称自动引用计数,是一种内存管理机制.当一块内存的强引用的数目等于0的时候,则这块内存将会被释放. 由于在Swift中,枚举和结构体都是值类型,不通过引用方式进行存储和传递,所以Swift中只有类的实例会进行自动引用计数. 规则:在创建的初始,类的实例的引用计数为1,没增加一次强引用,引用计数加1,每个强引用为nil后,引用计数减1.弱引用不会增加引用计数,关键词weak 注意,不能访问已经被释放了的内存,这样会造成程序崩溃. 一.强弱引用 用下图表示会直观一些 一个强引用,一个弱引用.