Swift 擴展

擴展就是向一個已有的類薪丁、結(jié)構(gòu)體或枚舉類型添加新功能遇西。擴展可以對一個類型添加新的功能粱檀,但是不能重寫已有的功能。Swift 中的擴展可以:添加計算型屬性和計算型靜態(tài)屬性定義實例方法和類型方法提供新的構(gòu)造器定義下標(biāo)定義和使用新的嵌套類型使一個已有類型符合某個協(xié)議語法擴展聲明使用關(guān)鍵字 extension:extension SomeType {? ? // 加到SomeType的新功能寫到這里}一個擴展可以擴展一個已有類型渗常,使其能夠適配一個或多個協(xié)議,語法格式如下:extension SomeType: SomeProtocol, AnotherProctocol {? ? // 協(xié)議實現(xiàn)寫到這里}計算型屬性擴展可以向已有類型添加計算型實例屬性和計算型類型屬性癌椿。實例下面的例子向 Int 類型添加了 5 個計算型實例屬性并擴展其功能:extension Int {? var add: Int {return self + 100 }? var sub: Int { return self - 10 }? var mul: Int { return self * 10 }? var div: Int { return self / 5 }}? ? let addition = 3.addprint("加法運算后的值:\(addition)")? ? let subtraction = 120.subprint("減法運算后的值:\(subtraction)")? ? let multiplication = 39.mulprint("乘法運算后的值:\(multiplication)")? ? let division = 55.divprint("除法運算后的值: \(division)")let mix = 30.add + 34.subprint("混合運算結(jié)果:\(mix)")以上程序執(zhí)行輸出結(jié)果為:加法運算后的值:103減法運算后的值:110乘法運算后的值:390除法運算后的值: 11混合運算結(jié)果:154構(gòu)造器擴展可以向已有類型添加新的構(gòu)造器送粱。這可以讓你擴展其它類型,將你自己的定制類型作為構(gòu)造器參數(shù)世舰,或者提供該類型的原始實現(xiàn)中沒有包含的額外初始化選項。擴展可以向類中添加新的便利構(gòu)造器 init()震蒋,但是它們不能向類中添加新的指定構(gòu)造器或析構(gòu)函數(shù) deinit() 。struct sum {? ? var num1 = 100, num2 = 200}struct diff {? ? var no1 = 200, no2 = 100}struct mult {? ? var a = sum()? ? var b = diff()}extension mult {? ? init(x: sum, y: diff) {? ? ? ? _ = x.num1 + x.num2? ? ? ? _ = y.no1 + y.no2? ? }}let a = sum(num1: 100, num2: 200)let b = diff(no1: 200, no2: 100)let getMult = mult(x: a, y: b)print("getMult sum\(getMult.a.num1, getMult.a.num2)")print("getMult diff\(getMult.b.no1, getMult.b.no2)")以上程序執(zhí)行輸出結(jié)果為:getMult sum(100, 200)getMult diff(200, 100)方法擴展可以向已有類型添加新的實例方法和類型方法。下面的例子向Int類型添加一個名為 topics 的新實例方法:extension Int {? func topics(summation: () -> ()) {? ? ? for _ in 0..()類型的單參數(shù)直砂,表明函數(shù)沒有參數(shù)而且沒有返回值。

定義該擴展之后洽蛀,你就可以對任意整數(shù)調(diào)用 topics 方法,實現(xiàn)的功能則是多次執(zhí)行某任務(wù):

可變實例方法

通過擴展添加的實例方法也可以修改該實例本身。

結(jié)構(gòu)體和枚舉類型中修改self或其屬性的方法必須將該實例方法標(biāo)注為mutating异赫,正如來自原始實現(xiàn)的修改方法一樣故爵。

實例

下面的例子向 Swift 的 Double 類型添加了一個新的名為 square 的修改方法,來實現(xiàn)一個原始值的平方計算:

extension Double {

mutating func square() {

let pi = 3.1415

self = pi * self * self

}

}

var Trial1 = 3.3

Trial1.square()

print("圓的面積為: \(Trial1)")

var Trial2 = 5.8

Trial2.square()

print("圓的面積為: \(Trial2)")

var Trial3 = 120.3

Trial3.square()

print("圓的面積為: \(Trial3)")

以上程序執(zhí)行輸出結(jié)果為:

圓的面積為: 34.210935

圓的面積為: 105.68006

圓的面積為: 45464.070735

下標(biāo)

擴展可以向一個已有類型添加新下標(biāo)。

實例

以下例子向 Swift 內(nèi)建類型Int添加了一個整型下標(biāo)费就。該下標(biāo)[n]返回十進制數(shù)字

extension Int {

subscript(var multtable: Int) -> Int {

var no1 = 1

while multtable > 0 {

no1 *= 10

--multtable

}

return (self / no1) % 10

}

}

print(12[0])

print(7869[1])

print(786543[2])

以上程序執(zhí)行輸出結(jié)果為:

2

6

5

嵌套類型

擴展可以向已有的類、結(jié)構(gòu)體和枚舉添加新的嵌套類型:

extension Int {

enum calc

{

case add

case sub

case mult

case div

case anything

}

var print: calc {

switch self

{

case 0:

return .add

case 1:

return .sub

case 2:

return .mult

case 3:

return .div

default:

return .anything

}

}

}

func result(numb: [Int]) {

for i in numb {

switch i.print {

case .add:

print(" 10 ")

case .sub:

print(" 20 ")

case .mult:

print(" 30 ")

case .div:

print(" 40 ")

default:

print(" 50 ")

}

}

}

result([0, 1, 2, 3, 4, 7])

以上程序執(zhí)行輸出結(jié)果為:

10

20

30

40

50

50

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末河狐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捐祠,更是在濱河造成了極大的恐慌,老刑警劉巖率拒,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呛伴,死亡現(xiàn)場離奇詭異,居然都是意外死亡铁材,警方通過查閱死者的電腦和手機村生,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門葬毫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忽肛,“玉大人,你說我怎么就攤上這事罕模〉睿” “怎么了媒殉?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長售貌。 經(jīng)常有香客問我扯饶,道長,這世上最難降的妖魔是什么携丁? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮存筏,結(jié)果婚禮上搏色,老公的妹妹穿的比我還像新娘。我一直安慰自己集币,他們只是感情好秽之,可當(dāng)我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布河质。 她就那樣靜靜地躺著散休,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夺颤。 梳的紋絲不亂的頭發(fā)上姻几,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天俭驮,我揣著相機與錄音,去河邊找鬼。 笑死崭倘,一個胖子當(dāng)著我的面吹牛悉患,可吹牛的內(nèi)容都是我干的谴仙。 我是一名探鬼主播揩局,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼阐滩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤帜乞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肉拓,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡露久,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缸逃。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吃靠,到底是詐尸還是另有隱情族奢,我是刑警寧澤,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布锅纺,位于F島的核電站,受9級特大地震影響减拭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一绢记、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至煤禽,卻和暖如春选脊,著一層夾襖步出監(jiān)牢的瞬間丹诀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓椭员,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,851評論 2 361

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