swift類型擴展

/**

1.擴展語法

2.計算型屬性

3.構造器

4.方法

5.下標

6.嵌套類型

擴展就是向一個已有的類、結構體或枚舉類型添加新功能。包括在沒有權限獲取原始源代碼的情況下擴展類型的能力(即逆向建模)。擴展和OC中的分類(category)類似。不過與OC不同的是,swift的擴展沒有名字。

如果定義一個擴展向已有類型添加新功能,那麼這個心功能對該類型的所有已有實例中都是可用的,即使他們是在換個擴展的前面定義的

*/



//擴展語法

/**

聲明一個擴展使用關鍵字extension

extension SomeType {

    // 加到SomeType的新功能寫到這

}

一個擴展可以擴展一個已有類型,使其能夠適配一個或多個協議。當這種情況發生時,接口的名字應該完全按照類或結構體的名字的方式進行書寫

extension SomeType: SomeProtocol, AnotherProctocol { 

    // 協議實現寫到這

}

按照這種方式添加的協議遵循者被稱之爲在擴中添加協議遵循者

*/




//計算型屬性

/**

擴展可以向已有類型添加計算型實例屬性和計算型類型屬性

*/

extension Double {

    var km: Double{

        return self * 1000.0;

    }

    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");

let threeFeet = 3.ft;

print("Three feet is \(threeFeet) meters");

let aMarathon = 42.km + 195.m;

print("a marathon is \(aMarathon) meters long");

/**

擴展可以添加新的計算屬性,但是不可以添加存儲屬性,也不可以向已有屬性添加屬性觀測器

*/


//構造器

/**

擴展可以向已有類型添加新的構造器。這可以讓你擴展其它類型,將自己的定製類型作爲構造器參數,或者提供該類型的原始實現中沒有包含的額外初始化選項

如果使用擴展向一個值類型添加一個構造器,該構造器向所有的存儲屬性提供默認值,而且沒有定義任何定製構造器,那麼對於來自你的擴展構造器中的值類型,你可以調用默認構造器的成員級構造器,正如在值類型的構造器授權中描述的,如果你已經把構造器寫成值類型原始實現的一部分,上述規則不再使用

*/

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();

}

let defaultRect = Rect();

//let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0));

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);

    }

}

let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0));

print("X:\(centerRect.origin.x),Y:\(centerRect.origin.y)\nwidth:\(centerRect.size.width),height:\(centerRect.size.height)");

/**

如果你使用擴展提供了一個新的構造器,你依舊有責任保證構造過程能夠讓所有實例完全初始化

*/



//方法

/**

擴展可以向已有類型添加新的實例方法和類型方法

*/

extension Int {

    func repetitons(task: () -> ()) {//表明函數沒有參數而且沒有返回值

    for _ in 0..<self {

        task();

    }

    }

}


3.repetitons({

        print("hello~");

        });


4.repetitons({

            print("world!");

            });


//修改實例方法

/**

通過擴展添加實例方法也可以修改該實例本身。結構體和枚舉類型中修改self或其屬性的方法必須將該實例方法標註爲mutating,正如來自原始實現的修改方法一樣

*/

extension Int {

    mutating func square() -> Int {

    return self * self;

    }

}

var someInt = 3;

print(someInt.square());



//下標

/**

擴展可以向一個已有類型添加新下標

逆向下標

*/

extension Int {

    subscript(digitIndex: Int) -> Int {

    var decimalBase = 1;

    if digitIndex == 0 {

    return self % 10;

    }

    for _ in 1...digitIndex {

    decimalBase *= 10;

    }

    if self / decimalBase < 1 {

        return 0;

    }

    return (self / decimalBase) % 10;

    }

}

print(73456875885[6]);



//嵌套類型

/**

擴展可以向已有的類、結構體和枚舉添加新的嵌套類型

*/

extension Character {

    enum Kind {

    case Vowel, Consonant, Other;

    }

    var kind: Kind {

        switch String(self).lowercaseString {

        case "a","e","i","o","u":

            return .Vowel;

        case "b","c","d","f","g","h","j","k","l","m","n","p","q":

            return .Consonant;

    default:

            return .Other;

        }

    }

}


func printLetterKinds(word: String) {

    print("\'\(word)' is made up of the following kinds of letters:");

    for character in word.characters {

    switch character.kind {

        case .Vowel:

                print("vowel");

        case .Consonant:

                print("Consonant");

        case .Other:

                print("other");

        }

    }

}


printLetterKinds("Hello");


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章