Swift教程第二章(6)

swift language part-2.6

Swift教程第二章(6)–Swift基础

扩展、协议

##扩展 注意:如果定义一个扩展,此扩展对该类型的所有已有实例都是可用的

使用关键字extension

###扩展属性

extension Double{
	var km:Double{return self*1000}
}

###扩展构造器

extension Rect{
	init(...){

	}
}

###扩展方法

extension Int{
	func repetitions(task:()->()){
		for i in 0..self{
			task()
		}
	}
}

###修改实例方法 使用关键字mutating

extension Int{
	mutating func square(){
		self=self*self
	}
}

var someint=3
someint.square()
//someint is 9 now

###下标(使用内部脚本实现)

向Int添加一个下标,返回十进制数字从又想做的第n个数字

extension Int{
	subscriot(digitIndex:Int)->Int{
		var decimalBase=1
		for _ in 1...digitIndex{
			decimalBase*=10
		}
		return (self/decimalBase)%10
	}
}
//123456789[0]=9
//123456789[1]=8

##协议 使用关键字protocol用于统一方法和属性的名称,而不是现任和功能。协议能够被类、枚举、结构体实现,满足协议要求的类、枚举、结构体被称为协议的遵循着

很像其他语言的接口:)

语法:

protocol SomeProtocol{
	//协议内容
}

###属性要求

//协议定义
protocol SomeProtocol{
	//只读属性
	var name:String{get}
	var age:Int{get set}
}

用类实现协议时,使用class关键字来表示属性为类成员,用结构体或枚举实现协议时则使用static关键字来表示

protocol AnotherProtocol{
	class var someTypeProperty:Int{get set}
}

###方法要求

protocol SomeProtocol{
	class func someTypeMethod()
}

protocol RandomNumberGenerator{
	func random()->Double
}

###突变方法要求 能在方法或函数内部改变实力类型的方法成为突变方法,使用关键字mutating

注意:用class实现协议中的mutating方法时,不用谢mutating关键字,用结构体、枚举实现协议中的mutating方法是必须有mutating关键字

protocol Togglable{
	mutating func toggle()
}

enum OnOffswitch:Togglable{
	case Off,On
	mutating func toggle(){
		switch self{
			case Off:
				self=On
			case On:
				self=Off
		}
	}
}

var lightSwitch=OnOffswitch.Off
lightSwitch.toggle()
//lightSwitch现在为.On

###协议类型

协议本身不识闲任何功能,但可以将它当做类型来使用,场景如下:

  1. 作为函数,方法或构造其中的参数类型,返回值类型
  2. 作为常熟,变量、属性的类型
  3. 作为数组,字典或其他容器中的元素类型

###委托(代理)模式 允许类或结构体将一些需要他们负责的功能委托给其他类型。定义协议来封装那些需要被委托的和你熟和方法,使其遵循者拥有这些被委托的函数和方法。委托模式可以用来响应特定的动作或接受外部数据员提供的数据,而不需要知道外部数据源的类型。

###通过延展补充协议声明 当一个类型已经实现了协议中的所有要求,却没有声明时,使用extension关键字声明补充协议声明

extension hamster:SomeProtocol{}

把hamster当做SomeProtocol类型使用时还需要显示的类型转换

###协议的继承 一个协议可以继承其他的协议

###协议合成 一个协议可由多个协议采用protocol<SomeProtocol,AnotherProtocol>这样的格式进行组合,成为协议组合(protocol composition)

注意:协议合成并不会生成一个新协议类型,而是将多个协议合成一个临时的协议,超出范围后立刻失效。

###可选协议类型 使用关键字@optional标记可选择实现的属性或方法,在协议前使用@objc