# Swift 擴展

Swift 擴展功能：

• 添加計算屬性並計算類型屬性

• 定義實例和類型的方法

• 提供了新的初始化

• 定義下標

• 定義和使用新的嵌套類型

• 使現有類型符合協議

### 語法

extension SomeType { // new functionality can be added here }

extension SomeType: SomeProtocol, AnotherProtocol { // protocol requirements is described here }

## 計算屬性

extension Int { var add: Int {return self + 100 } var sub: Int { return self - 10 } var mul: Int { return self * 10 } var div: Int { return self / 5 } } let addition = 3.add println("Addition is \(addition)") let subtraction = 120.sub println("Subtraction is \(subtraction)") let multiplication = 39.mul println("Multiplication is \(multiplication)") let division = 55.div println("Division is \(division)") let mix = 30.add + 34.sub println("Mixed Type is \(mix)")

Subtraction is 110
Multiplication is 390
Division is 11
Mixed Type is 154

## 初始化器

Swift 能夠靈活地通過擴展新的初始化添加到現有的類型。用戶可以添加自己的自定義類型來擴展已定義的類型，額外的初始化選項也是可以的。 擴展僅支持 init(). 而 deinit() 不被擴展支持。

struct sum { var num1 = 100, num2 = 200 } struct diff { var no1 = 200, no2 = 100 } struct mult { var a = sum() var b = diff() } let calc = mult() println ("Inside mult block \(calc.a.num1, calc.a.num2)") println("Inside mult block \(calc.b.no1, calc.b.no2)") let memcalc = mult(a: sum(num1: 300, num2: 500),b: diff(no1: 300, no2: 100)) println("Inside mult block \(memcalc.a.num1, memcalc.a.num2)") println("Inside mult block \(memcalc.b.no1, memcalc.b.no2)") extension mult { init(x: sum, y: diff) { let X = x.num1 + x.num2 let Y = y.no1 + y.no2 } } let a = sum(num1: 100, num2: 200) println("Inside Sum Block:\( a.num1, a.num2)") let b = diff(no1: 200, no2: 100) println("Inside Diff Block: \(b.no1, b.no2)")

Inside mult block (100, 200)
Inside mult block (200, 100)
Inside mult block (300, 500)
Inside mult block (300, 100)
Inside Sum Block:(100, 200)
Inside Diff Block: (200, 100)

## 方法

extension Int { func topics(summation: () -> ()) { for _ in 0..<self { summation() } } } 4.topics({ println("Inside Extensions Block") }) 3.topics({ println("Inside Type Casting Block") })

Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Extensions Block
Inside Type Casting Block
Inside Type Casting Block
Inside Type Casting Block

topics() 函數使用參數是 (summation: () -> ()) 的類型表示該函數不帶任何參數 而且它不會返回任何值。調用該函數多次， 塊被初始化，並調用 topic()方法初始化。

## 不同實例方法變形

extension Double { mutating func square() { let pi = 3.1415 self = pi * self * self } } var Trial1 = 3.3 Trial1.square() println("Area of circle is: \(Trial1)") var Trial2 = 5.8 Trial2.square() println("Area of circle is: \(Trial2)") var Trial3 = 120.3 Trial3.square() println("Area of circle is: \(Trial3)")

Area of circle is: 34.210935
Area of circle is: 105.68006
Area of circle is: 45464.070735

## 下標

extension Int { subscript(var multtable: Int) -> Int { var no1 = 1 while multtable > 0 { no1 *= 10 --multtable } return (self / no1) % 10 } } println(12[0]) println(7869[1]) println(786543[2])

2
6
5

## 嵌套類型

extension Int { enum calc { case add case sub case mult case div case anything } var print: calc { switch self { case 0: return .add case 1: return .sub case 2: return .mult case 3: return .div default: return .anything } } } func result(numb: [Int]) { for i in numb { switch i.print { case .add: println(" 10 ") case .sub: println(" 20 ") case .mult: println(" 30 ") case .div: println(" 40 ") default: println(" 50 ") } } } result([0, 1, 2, 3, 4, 7])

10
20
30
40
50
50