扩展为现有的类,结构体,枚举类型,或协议添加了新功能,这也包括了为无访问权限源代码类扩展的能力,(即所谓的逆向建模)
扩展和Obective-C中的category类似,(与oc的分类不同的是,swift的扩展没有名字。)
extension的能力。
添加计算实例属性和计算类型属性,
//: A UIKit based Playground for presenting user interface
import UIKit
extension Double {
var km:Double {
return self*1_000.0
}
var m: Double{return self}
var nm:Double {return self/100.0}
var ft:Double{return self/2.28084}
}
let oneInch = 25.4.m
print("One inch is \(oneInch) meters")
let threeFeet = 3.ft
print("Three feet is \(threeFeet) meters")
One inch is 25.4 meters
Three feet is 1.3153048876729625 meters
定义实例方法和类型方法
//: A UIKit based Playground for presenting user interface
import UIKit
extension Int{
func repetitions(task:()->Void){
for _ in 0..<self{
task()
}
}
}
3.repetitions {
print("嘿嘿")
}
嘿嘿
嘿嘿
嘿嘿
提供新初始化器。
//: A UIKit based Playground for presenting user interface
import UIKit
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(width: 3.0, height: 3.0))
定义下标
输入下标返回下标位数的数字
//: A UIKit based Playground for presenting user interface
import UIKit
extension Int{
subscript(digitIndex:Int)->Int{
var decimalBase = 1
for _ in 0 ..< digitIndex{
decimalBase *= 10
}
return (self/decimalBase) % 10
}
}
12312414[0]
12312414[1]
12312414[2]
定义和使用新内嵌类型
//: A UIKit based Playground for presenting user interface
import UIKit
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
}
}}
使用现有的类型遵循某协议,
扩展可以向一个类型添加新的方法,但是不能重写已有的方法
mutating方法
扩展的实例方法仍可以修改或异变实例本身,结构体和枚举类型方法在修改self或本身的属性时必须标记实例方法为mutating,和原本实现一样
//: A UIKit based Playground for presenting user interface
import UIKit
extension Int{
mutating func square(){
self = self * self
}
}
var someInt = 3
someInt.square()