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ò)展語(yǔ)法


聲明一個(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ǔ)屬性,也不可以向已有屬性添加屬性觀察器F锿琛I嗳浴妒貌!


三、構(gòu)造器


擴(kuò)展可以向已有類型添加新的構(gòu)造器铸豁,這讓可以擴(kuò)展其他類型灌曙,將自己定制類型作為構(gòu)造器參數(shù),或者提供該類型的原始實(shí)現(xiàn)中沒有包含的額外初始化選項(xiàng)节芥。
?擴(kuò)展能向類中添加新的便利構(gòu)造器在刺,但不能向類中添加新的指定構(gòu)造器或析構(gòu)器,即是說(shuō)指定構(gòu)造器和析構(gòu)器必須總是由原始類實(shí)現(xiàn)來(lái)提供头镊。

/** 
 矩形結(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));
01-矩形(0,0,3,3)
// 給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
02-矩形(0,0,4,4)


四相艇、方法


擴(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)境

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市臭墨,隨后出現(xiàn)的幾起案子赔嚎,更是在濱河造成了極大的恐慌,老刑警劉巖胧弛,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尤误,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡结缚,警方通過查閱死者的電腦和手機(jī)损晤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)红竭,“玉大人尤勋,你說(shuō)我怎么就攤上這事∫鹣埽” “怎么了最冰?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)稀火。 經(jīng)常有香客問我暖哨,道長(zhǎng),這世上最難降的妖魔是什么凰狞? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任篇裁,我火速辦了婚禮沛慢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘达布。我一直安慰自己团甲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布黍聂。 她就那樣靜靜地躺著躺苦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪产还。 梳的紋絲不亂的頭發(fā)上圾另,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音雕沉,去河邊找鬼。 笑死去件,一個(gè)胖子當(dāng)著我的面吹牛坡椒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尤溜,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼倔叼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了宫莱?” 一聲冷哼從身側(cè)響起丈攒,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎授霸,沒想到半個(gè)月后巡验,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡碘耳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年显设,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辛辨。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捕捂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出斗搞,到底是詐尸還是另有隱情指攒,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布僻焚,位于F島的核電站允悦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溅呢。R本人自食惡果不足惜澡屡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一猿挚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧驶鹉,春花似錦绩蜻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至姚淆,卻和暖如春孕蝉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腌逢。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工降淮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搏讶。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓佳鳖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親媒惕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子系吩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,805評(píng)論 1 10
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說(shuō)閱讀 10,970評(píng)論 6 13
  • 擴(kuò)展 擴(kuò)展就是向一個(gè)已有的類、結(jié)構(gòu)體妒蔚、枚舉類型或者協(xié)議類型添加新功能穿挨。這包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類...
    cht005288閱讀 465評(píng)論 0 0
  • Swift屬性 Swift屬性將值跟特定的類,結(jié)構(gòu)體肴盏,枚舉關(guān)聯(lián)科盛。分為存儲(chǔ)屬性和計(jì)算屬性,通常用于特定類型的實(shí)例叁鉴。屬...
    小小廚師閱讀 854評(píng)論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理土涝,服務(wù)發(fā)現(xiàn),斷路器幌墓,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139