/*
扩展为现有的类、结构体、枚举类型、或协议添加了新功能。这也包括了为无访问权限的源代码扩展类型的能力(即所谓的逆向建模)。扩展和 Objective-C 中的分类类似。(与 Objective-C 的分类不同的是,Swift 的扩展没有名字。)
Swift 中的扩展可以:
添加计算实例属性和计算类型属性;
定义实例方法和类型方法;
提供新初始化器;
定义下标;
定义和使用新内嵌类型;
使现有的类型遵循某协议
在 Swift 中,你甚至可以扩展一个协议,以提供其要求的实现或添加符合类型的附加功能
*/
//使用 extension 关键字来声明扩展
//extension someType{
//
//}
//扩展可以使已有的类型遵循一个或多个协议。在这种情况下,协议名的书写方式与类或结构体完全一样:
//extension SomeType: SomeProtocol, AnotherProtocol {
// implementation of protocol requirements goes here
//}
//计算属性 扩展可以向已有的类型添加计算实例属性和计算类型属性
extension Double{
var km :Double {return self * 1000 }
var m:Double {return self}
}
let km = 24.0.km
print(km)
//初始化器 扩展可向已有的类型添加新的初始化器。这允许你扩展其他类型以使初始化器接收你的自定义类型作为形式参数,或提供该类型的原始实现中未包含的额外初始化选项。扩展能为类添加新的便捷初始化器,但是不能为类添加指定初始化器或反初始化器。指定初始化器和反初始化器 必须由原来类的实现提供
struct Size {
var width = 0.0, height = 0.0
}
struct Point {
var x = 0.0, y = 0.0
}
struct Rect {
var origin = Point()
var size = Size()
}
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - (size.width / 2)
let originY = center.y - (size.height / 2)
self.init(origin: Point(x: originX, y: originY), size: size)
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0),
size: Size( 3.0, height: 3.0))
//扩展可以为已有的类型添加新的实例方法和类型方法
extension Int{
func repetitions(task: ()-> Void) {
for _ in 0..<self {
task()
}
}
}
4.repetitions {
//使用尾随闭包语法使调用更加简洁
print("hello")
}
//异变实例方法
//增加了扩展的实例方法仍可以修改(或异变)实例本身。结构体和枚举类型方法在修改 self 或本身的属性时必须标记实例方法为 mutating ,和原本实现的异变方法一样。
extension Int{
mutating func square(){
self = self * self
}
}
var a:Int = 3
a.square()
//下标 扩展能为已有的类型添加新的下标
extension Int{
subscript (digitIndex:Int) -> Int{
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
print(012345[3])
//扩展可以为已有的类、结构体和枚举类型添加新的内嵌类型
extension Int{
enum Kind {
case Negative, Zero, Positive
}
var kind:Kind{
switch self {
case 0:
return .Zero
case let x where x>0:
return .Positive
default:
return .Negative
}
}
}
func printIntegerKinds(numbers:[Int]) {
for number in numbers {
switch number.kind {
case .Negative:
print("- ", terminator: "")
case .Zero:
print("0")
default:
print("+")
}
}
}
printIntegerKinds(numbers: [12,0,-1,34])