Swift:Extension和Protocol

來源:互聯網
上載者:User

標籤: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

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.