Swift4 基礎部分: Extensions(擴展)

本文是學習《The Swift Programming Language》整理的相關隨筆,基本的語法不作介紹,主要介紹Swift中的一些特性或者與OC差異點。

系列文章:

Extensions add new functionality to an existing class, 
structure, enumeration, or protocol type. This includes the 
ability to extend types for which you do not have access to 
the original source code (known as retroactive modeling). 
Extensions are similar to categories in Objective-C. (Unlike 
Objective-C categories, Swift extensions do not have names.)

Extensions in Swift can:

Add computed instance properties and computed type properties
Define instance methods and type methods
Provide new initializers
Define subscripts
Define and use new nested types
Make an existing type conform to a protocol
  • Swift中的擴展與OC中的類別很相似,闊以用來擴展方法,屬性,同時還可以提供新的構造器,定義下標,定義與使用新的嵌套類型,使這個擴展實現某個協議。

計算屬性(Computed Properties)

Extensions can add computed instance properties and computed 
type properties to existing types.
  • 擴展可以添加計算屬性到已有類中。

例子:

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 / 1_000.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");

執行結果:

One inch is 0.0254 meters
Three feet is 0.914399970739201 meters

構造器(Initializers)

Extensions can add new initializers to existing types.

例子:擴展Rect通過center,size計算Rect的值

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


// MARK: - 添加一個擴展通過center,size計算rect
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(centerRect);

方法(Methods)

Extensions can add new instance methods and type methods to existing types.
  • 擴展的方式可以添加新的實例方法和類方法到該類型。

例子:

extension Int {
    func repetitions(task: () -> Void){
        for index in 0..<self{
            task();
        }
    }
    
    func toBinary() -> String {
        return String(self,radix:2);
    }
    
    // 必須用mutating修飾才能修改自身
    mutating func square() {
        self = self * self
    }
}

3.repetitions(task:{
     print("Hello");
})
print(3.toBinary());

var someInt:Int = 3;
someInt.square();
print(someInt);

執行結果:

Hello
Hello
Hello
11
9

定義下標(Subscripts)

Extensions can add new subscripts to an existing type.

例子:

extension Int {
    subscript(digitIndex:Int) -> Int{
        var decimalBase:Int = 1;
        for index in 0..<digitIndex{
            decimalBase *= 10;
        }
        
        return (self / decimalBase) % 10;
    }
}

print(123456[2]);
print(123456[3]);
print(123456[4]);

執行結果:

4
3
2 

嵌套類型(Nested Types)

Extensions can add new nested types to existing classes, structures, and enumerations

例子:

extension Int {
    enum Kind {
        case negative,zero,positive;
    }
    
    var kind:Kind{
        switch self{
        case 0:
            return .zero;
        case let x where x > 0:
            return .positive;
        default:
            return .negative;
        }
    }
}


print(12345.kind);
print(0.kind);
print((-12345).kind);

執行結果:

positive
zero
negative
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,428評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,024評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,285評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,548評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,328評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,878評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,971評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,098評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,616評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,554評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,725評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,243評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,971評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,361評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,613評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,339評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,695評論 2 370

推薦閱讀更多精彩內容

  • 發現 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,142評論 4 61
  • Step 1選摘:只有博學的人才有融會貫通的能力(甚至是機會)。 于是,學習的時候,“莫問前程但行好事”是最優策略...
    簡希日課閱讀 224評論 0 3
  • 背景 我們在開發的時候肯定會打一些Log,特別是在調試代碼或者bug的時候,我們都會打一些Log日志來記錄,但是當...
    Only凹凸曼閱讀 2,272評論 2 6
  • 人畢竟是一種感性生物,沒有誰可以永遠保持理性思考。 東邪西毒里有一句經典臺詞:從小我就懂得保護自己,我知道要想不被...
    冰星星閱讀 274評論 1 0
  • 文/那年沐子 相思苦,相思累, 相思愁斷腸, 片片秋風飛。 相思難,相思意, 相思滿心頭, 縷縷青絲悲。
    那年沐子閱讀 299評論 0 1