18-Swift擴(kuò)展(Extensions)

擴(kuò)展就是向一個(gè)已有的類炬转、結(jié)構(gòu)體辆苔、枚舉類型或協(xié)議類型添加新功能。而且還包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類型的能力(逆向建模)扼劈。
?swift中的擴(kuò)展可以:
??- 添加計(jì)算型屬性和計(jì)算型靜態(tài)屬性
??- 定義實(shí)例方法和類型方法
??- 提供新的構(gòu)造器
??- 定義下標(biāo)
??- 定義和使用新的嵌套類型
??- 使一個(gè)已有類型符合某個(gè)協(xié)議
?在swift中驻啤,甚至都可以對(duì)一個(gè)協(xié)議進(jìn)行擴(kuò)展,提供協(xié)議需要的實(shí)現(xiàn)荐吵,或添加額外的功能骑冗。

注意: 擴(kuò)展是對(duì)一個(gè)類型添加新的功能,但是不能重寫已有的功能先煎。

一贼涩、擴(kuò)展語法


聲明一個(gè)擴(kuò)展使用關(guān)鍵字extension

extension SomeType {
  // 加到SomeType的新功能
}

給已有類型擴(kuò)展,是其能夠適配一個(gè)或多個(gè)協(xié)議薯蝎,而這種情況協(xié)議的名字應(yīng)該完全按照類或結(jié)構(gòu)體的名字方式進(jìn)行書寫:

extension SomeType:SomeProtocol, AnotherProctocal {
  // 協(xié)議具體實(shí)現(xiàn)
}

二遥倦、計(jì)算型屬性


擴(kuò)展可以向已有類型添加計(jì)算型實(shí)例屬性和計(jì)算型類型屬性:

// 功能: 給系統(tǒng)的Double類型添加3個(gè)計(jì)算型實(shí)例屬性,方便單位的轉(zhuǎn)換占锯,方便閱讀
// 默認(rèn)設(shè)置的米為單位袒哥,即Double型的值1.0,表示就是“1米”
extension Double {
    // 千米
    var km:Double {
        return self * 1_000.0;
    }

    // 米
    var m:Double {
        return self;
    }

    // 厘米
    var cm:Double {
        return self / 100.0;
    }
}

// 身高183cm
let myHeight = 183.cm;
print("我的身高\(yùn)(myHeight.m)米");
輸出結(jié)果:
我的身高1.83米

注意: 擴(kuò)展可以添加新的計(jì)算屬性消略,但不可以添加存儲(chǔ)屬性堡称,也不可以向已有屬性添加屬性觀察器!R杉蟆粮呢!

三、構(gòu)造器


擴(kuò)展可以向已有類型添加新的構(gòu)造器钞艇,這讓可以擴(kuò)展其他類型啄寡,將自己定制類型作為構(gòu)造器參數(shù),或者提供該類型的原始實(shí)現(xiàn)中沒有包含的額外初始化選項(xiàng)哩照。
?擴(kuò)展能向類中添加新的便利構(gòu)造器挺物,但不能向類中添加新的指定構(gòu)造器或析構(gòu)器,即是說指定構(gòu)造器和析構(gòu)器必須總是由原始類實(shí)現(xiàn)來提供飘弧。

/** 
 矩形結(jié)構(gòu)體Rect
 矩形大小結(jié)構(gòu)體Size
 矩形位置結(jié)構(gòu)體Point
 */
// 矩形大小
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();
}

// 使用結(jié)構(gòu)體的成員逐一構(gòu)造器
// 矩形是位置在原點(diǎn)(0,0)识藤,大小(3,3)
// 如下圖所示
let myRect = Rect(origin: Point(x: 0.0, y: 0.0),
                  size: Size(width: 3.0, height: 3.0));

// 給Rect結(jié)構(gòu)體擴(kuò)展一個(gè)構(gòu)造器砚著,使用矩形的中心點(diǎn)和大小表示結(jié)構(gòu)體
extension Rect {
    // 中心點(diǎn)center    大小size
    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);
    }
}

// 位置為(0,0),大小為(4,4),這個(gè)矩形的中心點(diǎn)位置是(2,2)
// 如下圖所示
let myRect = Rect(center: Point(x: 2, y: 2),
                  size: Size(width: 4, height: 4));
// 驗(yàn)證位置是不是(0,0)
print(myRect.origin.x)
print(myRect.origin.y)
輸出結(jié)果:
0.0
0.0

四、方法


擴(kuò)展可以向已有類型添加新的實(shí)例方法和類型方法:

// 給Int類型擴(kuò)展一個(gè)新實(shí)例方法
extension Int {
    // 擴(kuò)展一個(gè)打印遍歷方法
    func helloFunc() {
        for i in 1...self {
            print("\(i)-hello Swift!")
        }
    }
}

var num:Int = 3;
num.helloFunc();
輸出結(jié)果:
1-hello Swift!
2-hello Swift!
3-hello Swift!

五痴昧、下標(biāo)


擴(kuò)展可以向已有類型添加新下標(biāo):

 // 給Int添加一個(gè)下標(biāo)
extension Int {
    // 擴(kuò)展下標(biāo)稽穆,獲取數(shù)據(jù)中對(duì)應(yīng)的位數(shù)的數(shù)字
    // 例如123, 123[0]表示取出個(gè)位數(shù)字3
    // 例如789赶撰, 789[2]表示取出百位數(shù)字7
    subscript(var index:Int) -> Int {
        // 臨時(shí)變量
        var temp = 1;
        while index > 0 {
            // 是取出第幾位
            // 例如取出百位舌镶,temp就是100;取出10位豪娜,temp就為10
            temp *= 10;

            index -= 1;
        }

        return (self / temp) % 10;
    }
}

var num = 123456;
print(num[0]);
num = 784312312;
print(num[2]);
輸出結(jié)果:
6
3

注:xcode7.3環(huán)境

作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有餐胀,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瘤载,一起剝皮案震驚了整個(gè)濱河市否灾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸣奔,老刑警劉巖墨技,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異挎狸,居然都是意外死亡健提,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門伟叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脐嫂,你說我怎么就攤上這事统刮。” “怎么了账千?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵侥蒙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我匀奏,道長(zhǎng)鞭衩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任娃善,我火速辦了婚禮论衍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聚磺。我一直安慰自己坯台,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布瘫寝。 她就那樣靜靜地躺著蜒蕾,像睡著了一般稠炬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪啡,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天首启,我揣著相機(jī)與錄音,去河邊找鬼撤摸。 笑死毅桃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的愁溜。 我是一名探鬼主播疾嗅,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼冕象!你這毒婦竟也來了代承?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤渐扮,失蹤者是張志新(化名)和其女友劉穎论悴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體墓律,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膀估,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了耻讽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片察纯。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖针肥,靈堂內(nèi)的尸體忽然破棺而出饼记,到底是詐尸還是另有隱情,我是刑警寧澤慰枕,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布具则,位于F島的核電站,受9級(jí)特大地震影響具帮,放射性物質(zhì)發(fā)生泄漏博肋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一蜂厅、第九天 我趴在偏房一處隱蔽的房頂上張望匪凡。 院中可真熱鬧,春花似錦掘猿、人聲如沸锹雏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽礁遵。三九已至轻绞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佣耐,已是汗流浹背政勃。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兼砖,地道東北人奸远。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像讽挟,于是被迫代替她去往敵國(guó)和親懒叛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 擴(kuò)展就是向一個(gè)已有的類耽梅、結(jié)構(gòu)體薛窥、枚舉類型或協(xié)議類型添加新功能。而且還包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類型的...
    EndEvent閱讀 521評(píng)論 0 3
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,783評(píng)論 1 10
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 10,928評(píng)論 6 13
  • Swift屬性 Swift屬性將值跟特定的類眼姐,結(jié)構(gòu)體诅迷,枚舉關(guān)聯(lián)。分為存儲(chǔ)屬性和計(jì)算屬性众旗,通常用于特定類型的實(shí)例罢杉。屬...
    小小廚師閱讀 846評(píng)論 0 0
  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來處理錯(cuò)誤。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無灃閱讀 1,244評(píng)論 0 3