標籤:switch 擴充和協議 extension和protocol
一、Swift中的擴充功能(Extension)可以動態給類增加功能,類似於Javascript中的prototype;而在objective-c中,是通過runtime來實現動態調用或者添加功能的。
定義方式如下:
extension SomeType {}
1. 單位轉換
extension Double { var km: Double {return self * 1000.0}}
調用的代碼如下:
let walk: Double = 25.4;print("25.4千米 = \(walk.km)米")
最終輸出結果為:"25.4千米 = 25400.0米"
從上面的定義可以看出:我們為類型Double擴充了一個唯讀屬性km,所以每次調用的時候,都會將結果乘以1000.0
2. 數字轉中文
func getChineseNumber(number: Int) -> String { let chineseList = "零一二三四五六七八九" let index = advance(chineseList.startIndex, number) return String(chineseList[index])}extension Int { func toChieseNumber() -> String { var result: String = "" var num = self; while (num > 0) { result = getChineseNumber(num % 10) + result; num = num / 10 } return result; }}
調用的代碼如下:
212332423.toChieseNumber()
最終輸出結果為:"二一二三三二四二三"
從上面的定義可以看出:我們為類型Int擴充了一個方法,這個方法的作用就是將輸入的數字轉化為中文字串。
二、Swift中的協議類似於C#中的介面(Interface),但Swift中的協議更強大,協議中不僅可以定義方法,
也可以定義屬性;協議不僅可以作用於類,還可以在結構體和枚舉中使用。
定義方式如下:
protocol SomeProtocol { // 協議內容}class SomeClass: SomeSuperClass, SomeProtocol { // 類的內容}
舉個例子:
protocol FullNamed { var fullName: String {get} func greeting() -> String}class Person: FullNamed { var fullName: String = "" init(fullName: String) { self.fullName = fullName } func greeting() -> String { return "hello " + self.fullName }}let zhansan = Person(fullName: "張三")println(zhansan.greeting())
注意:協議protocol中定義的相關屬性或者方法,實現它的類中,必須實現這些屬性和方法。
如,例子中FullNamed協議,定義了fullName屬性和greeting方法。在其實現的類Person中都有實現。
var fullName: String = "" 就是實現了協議FullNamed中的fullName屬性。
init初始化方法進一步對屬性fullName賦值。
協議的好處:就是協議中只定義屬性或者方法而沒有具體的實現,這些實現工作就交給了實現這個協議的類或者結構,枚舉等去完成。這樣,更有利於代碼的抽取及封裝。並且通過協議可以實現多態的效果及工廠功能等。
三、Swift的mutating關鍵字修飾方法是為了能在該方法中修改struct或者enum變數。而在類中,不需要;因為類中的方法本來就可以修改變數
舉個例子:
protocol Vehicle { var numberOfWheels: Int {get} var color: UIColor {get set} mutating func changeColor()}struct MyCar: Vehicle { let numberOfWheels = 4 var color = UIColor.redColor() mutating func changeColor() { self.color = UIColor.grayColor() }}
協議Vehicle中定義了一個方法changeColor,並且它是用mutating來修飾的。這樣的好處就是在實現協議的結構MyCar中的changeColor方法可以直接修改自己成員變數的值了,比如將color成員變數的值初始化為grayColor.
四、一個類如果實現了兩個protocol,並且這兩個protocol定義的方法有可能有重名的解決辦法舉個例子:
protocol A { func bar() -> Int}protocol B { func bar() -> String}class Dog: A, B { func bar() -> Int { return 1 } func bar() -> String { return "Hello" }}let instance = Dog()let num = (instance as A).bar()let str = (instance as B).bar()
注意,在調用bar方法的時候,必須指定是那個協議的bar方法,所以要經過類型轉化。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Swift:Extension和Protocol