Swift擴(kuò)展

擴(kuò)展: 就是給一個(gè)現(xiàn)存類, 結(jié)構(gòu)體, 枚舉或者協(xié)議添加新的屬性和方法的語(yǔ)法, 無(wú)需目標(biāo)源碼, 就可以把想要的代碼加到目標(biāo)上面蒸矛。
但有一些限制條件需要說(shuō)明:
1.不能添加一個(gè)已經(jīng)存在的方法或者屬性;
2.添加的屬性不能是存儲(chǔ)屬性, 只能是計(jì)算屬性;

格式:
 extension 某個(gè)先有類型{
    //增加新的功能
 }

擴(kuò)展計(jì)算屬性

class Transport {
    var scope:String
    init(scope:String) {
        self.scope = scope
    }
}
extension Transport {
    var extProperty:String{
        get{
            return scope
        }
    }
}
var myTrans = Transport(scope: "飛機(jī)")
print(myTrans.extProperty)

注意: 擴(kuò)展可以添加新的計(jì)算屬性,但它們不能添加存儲(chǔ)屬性净宵,或向現(xiàn)有屬性添加屬性觀察者赚哗。

擴(kuò)展構(gòu)造器

  • 擴(kuò)展可以向類添加新的便利構(gòu)造器,但是它們不能向類添加新的指定構(gòu)造器或析構(gòu)器。指定構(gòu)造器或析構(gòu)器必須始終由原始類實(shí)現(xiàn)提供晌姚。
  • 如果使用擴(kuò)展將構(gòu)造器添加到值類型中,該值類型為其所有存儲(chǔ)屬性提供默認(rèn)值歇竟,并且沒(méi)有任何自定義構(gòu)造器挥唠,則可以在擴(kuò)展的構(gòu)造器中調(diào)用該值類型的默認(rèn)構(gòu)造器和全能構(gòu)造器。
  • 如果使用擴(kuò)展將構(gòu)造器添加到聲明在另一個(gè)模塊中的結(jié)構(gòu)體中焕议,則新的構(gòu)造器只有從定義的模塊中調(diào)用了構(gòu)造器才能訪問(wèn)self
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()
}

Rect結(jié)構(gòu)為其所有屬性提供默認(rèn)值宝磨,所以它會(huì)自動(dòng)接收默認(rèn)構(gòu)造器和全能構(gòu)造器。這些構(gòu)造器可用于創(chuàng)建新的Rect實(shí)例:

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

可以擴(kuò)展Rect結(jié)構(gòu)體以提供額外的構(gòu)造器盅安,該構(gòu)造器具有特定的中心點(diǎn)和大小:

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))
// centerRect's origin is (2.5, 2.5) and its size is (3.0, 3.0)

注意:如果使用擴(kuò)展來(lái)提供一個(gè)新初始化器唤锉,要確保構(gòu)造器完成之后,每個(gè)實(shí)例都被完全初始化别瞭。

擴(kuò)展方法

  • 通過(guò)擴(kuò)展增加的實(shí)例方法可以修改實(shí)例本身
    如果結(jié)構(gòu)體和枚舉的方法要修改self或其屬性窿祥,則需要使用mutating關(guān)鍵字標(biāo)明
extension Int {
    mutating func square() {
        self = self * self
    }
}
var someInt = 3
someInt.square()

擴(kuò)展下標(biāo)

  • 擴(kuò)展可以向已存在的類型添加下標(biāo)
extension Int {
    subscript(digitIndex: Int) -> Int {
        var decimalBase = 1
        for _ in 0..<digitIndex {
            decimalBase *= 10
        }
        return (self / decimalBase) % 10
    }
}
746381295[0]
// returns 5
746381295[1]
// returns 9
746381295[2]
// returns 2
746381295[8]
// returns 7
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蝙寨,隨后出現(xiàn)的幾起案子壁肋,更是在濱河造成了極大的恐慌,老刑警劉巖籽慢,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浸遗,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡箱亿,警方通過(guò)查閱死者的電腦和手機(jī)跛锌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人髓帽,你說(shuō)我怎么就攤上這事菠赚。” “怎么了郑藏?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵衡查,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我必盖,道長(zhǎng)拌牲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任歌粥,我火速辦了婚禮塌忽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘失驶。我一直安慰自己土居,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布嬉探。 她就那樣靜靜地躺著擦耀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涩堤。 梳的紋絲不亂的頭發(fā)上眷蜓,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音定躏,去河邊找鬼账磺。 笑死芹敌,一個(gè)胖子當(dāng)著我的面吹牛痊远,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播氏捞,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼碧聪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了液茎?” 一聲冷哼從身側(cè)響起逞姿,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捆等,沒(méi)想到半個(gè)月后滞造,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栋烤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年谒养,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片明郭。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡买窟,死狀恐怖丰泊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情始绍,我是刑警寧澤瞳购,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站亏推,受9級(jí)特大地震影響学赛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜径簿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一罢屈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧篇亭,春花似錦缠捌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至柔昼,卻和暖如春哑芹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捕透。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工聪姿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人乙嘀。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓末购,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親虎谢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盟榴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345