【iOS】Swift中擴充extension與協議protocol,swiftextension

來源:互聯網
上載者:User

【iOS】Swift中擴充extension與協議protocol,swiftextension

一起連帶前面幾篇Playground小結代碼都轉到github上了,注釋寫了很多,主要方便自己以後可以翻翻看。Swift文法主要部分差不多就這些了。當然還有泛型、運算子多載、ARC、閉包之類的補充。


一、擴充(extension)

擴充 extension(類似OC中的分類,但Swift中沒有名字),即使在沒有許可權擷取到原始代碼的情況下,為類增加新功能.

注意: 只要定義了擴充, 那麼該擴充對該類的執行個體都是可用的.

extension SomeType{    //添加到SomeType的新功能寫在這裡}

1.1擴充屬性(只能是計算屬性)

//擴充可以添加新計算屬性, 但是不能添加儲存屬性(也不可以添加屬性觀察).extension Double{  //為API中的已有類型添加執行個體屬性    var km : Double { return self * 1_000.0 }    var m : Double { return self }    var cm : Double { return self / 100.0 }}let jjLength = 1.m  // 1與m進行點運算, 表示1的Double值let jjLength_km = 1.kmprintln(10.km + 1.m)

1.2擴充構造器

//可以定製自己的構造器class MyClass{    var a : Int    init(){        a = 10    }}extension MyClass{    convenience init(var parm:Int){   //擴充構造器        self.init()        println("擴充構造器--->遍曆構造器, \(parm)")    }}var myClass = MyClass(parm: 9)

1.3擴充方法

下面是像Int中擴充myIntFunc方法

extension Int{    func myIntFunc(){        println("值為\(self) , 哈哈哈哈!")    }}1.myIntFunc()

1.3.1 修改執行個體方法

通過擴充方法, 可以修改該執行個體self本身.但是方法前要加 mutating

extension Double{    mutating func myMoidfySelfValue{        self = self * self //修改self執行個體的值    }}var d = 2.0d.myMoidfySelfValue()

1.4 擴充巢狀型別

即向已有的巢狀型別中添加新的巢狀型別. 還可以擴充下標(附屬指令碼)等.

extension Character {    enum Kind{   //嵌套了一個枚舉類型        case Big        case Small    }    var k : Kind{        if(String(self).lowercaseString == "a"){            return Kind.Big        }else{            return Kind.Small        }    }}var ch : Character = "a"ch.k   //返回一個枚舉值Kind.Big

二、協議(protocol)

可定義方法與屬性, 由具體的類去實現. 越來越像Java

Swift中的協議能被類, 枚舉,結構體實現.

protocol SomeProtocol{    //協議內容}class SomeClass : SomeProtocol{ //實現協議, 可實現多個協議    }

2.1 協議中屬性/方法/突變方法的要求

2.1.1 屬性的要求

protocol AnotherProtocol1{    //class表示類成員(結構體/枚舉中用static)    class var property : Int { get set} //get, set 表示可讀可寫}class AnotherClass1 : AnotherProtocol1{    class var property : Int {  //實現協議中的屬性        get{            return 10        }        set{                    }    }}

2.1.2 方法要求

//不支援預設參數. 寫法上只是沒有方法的實現.protocol AnotherProtocol2{    func myFunc() -> Int   //只聲明不實現}class AnotherClass2 : AnotherProtocol2{    func myFunc() -> Int {  //實現方法        return 10    }}

2.1.3 突變方法要求

能在方法或函數內部改變執行個體類型的方法稱為突變方法. (mutating關鍵字)

在類中,可以不寫mutating, 但在結構體與枚舉中國必須寫

protocol Togg{    mutating func togg()}enum OnOffSwitch : Togg{    case Off , On        mutating func togg() { //改變執行個體的值        switch self{        case .Off:            self = On        case .On:            self = Off        }    }}var lightSwitch = OnOffSwitch.OfflightSwitch.togg()   //值變為On

2.2 協議類型.

協議也可以當做類型來使用. 這點和函數一樣.

1.可作為參數/返回值類型

2.可作為常量/變數/屬性的類型

3.可作為數組/字典和其他元素類型

protocol MyRect{    func myLuckNumber() -> Int}class MyRectImp : MyRect{    func myLuckNumber() -> Int {        return 10    }}class Dice {    let sides :Int    var gener : MyRect    //作為類型    init(sides:Int, gener:MyRect){  //作為參數        self.sides = sides        self.gener = gener    }}var dice = Dice(sides: 6, gener: MyRectImp())dice.gener.myLuckNumber()   //返回10

範例程式碼見:http://github.com/xn4545945/SwiftLearning


參考:

The Swift Programming Language  

Apple Dev Center


轉載請註明出處:http://blog.csdn.net/xn4545945  






聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.