擴展就是為一個已有的類轿亮、結構體、枚舉類型或者協(xié)議類型添加新功能烧颖。
1. 擴展語法
extension SomeType {
// code
}
可以通過擴展來擴展一個已有類型,使其采納一個或多個協(xié)議:
extension SomeType: SomeProtocol, AnotherProtocol {
// protocol code
}
2. 計算型屬性
extension Double {
var km: Double { return self * 1000 }
var m: Double { return self }
var cm: Double { return self / 100.0 }
var mm: Double { return self / 1000.0 }
var ft: Double { return self / 3.28084 }
}
let oneInch = 25.4.mm
print("One inch is \(oneInch) meters")
// print "One inch is 0.0254 meters"
注意:
擴展可以添加新的計算屬性,但是不可以添加存儲屬性,也不可以為已有屬性添加屬性觀察器。
3. 構造器
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)
}
}
這個新的構造器首先根據(jù)提供的center
和size
的值計算一個合適的原點。然后調用該結構體的逐一成員構造器init(origin:size:)
膨报,該構造器將新的原點和大小的值保存到了相應的屬性中:
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0))
注意:
如果你使用擴展提供了一個新的構造器,你依舊有責任確保構造過程能夠讓實例完全初始化适荣。
4. 方法
extension Int {
func repetitions(task:() -> Void) {
for _ in 0..<self {
task()
}
}
}
3.repetitions {
print("Hello")
}
// print "Hello"
// print "Hello"
// print "Hello"
4.1 可變實例方法
extension Int {
mutating func square() {
self = self * self
}
}
var someInt = 3
someInt.square()
print(someInt)
// print "9"
5. 下標
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1
for _ in 0..<digitIndex {
decimalBase *= 10
}
return (self / decimalBase) % 10
}
}
print(9876543210[2])
// print "2"
print(9876543210[3])
// print "3"
print(9876543210[15])
// print "0"
6. 嵌套類型
擴展可以為已有的類现柠、結構體和枚舉添加新的嵌套類型。
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", terminator:"")
case .Positive:
print("+", terminator:"")
}
}
print("")
}
printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
// print "++-0-0+"