Swift 擴(kuò)展(Extension)總結(jié)

概要

擴(kuò)展是給已經(jīng)存在的類(class)躬柬,結(jié)構(gòu)體(structure)丑罪,枚舉類型(enumeration)和協(xié)議(protocol)增加新的功能钢属。類似Objective-C中的Category哗戈,不同的是婆排,Extension沒有名字荒椭。擴(kuò)展可以做以下事情:

  • 增加計(jì)算實(shí)例屬性和計(jì)算類型屬性
  • 定義實(shí)例方法和類型方法
  • 提供新的初始化器
  • 定義下標(biāo)
  • 定義和使用新的內(nèi)置類型
  • 讓一個(gè)存在的類型服從一個(gè)協(xié)議

注:擴(kuò)展可以增加新的功能谐鼎,但是不能覆蓋已有的功能

擴(kuò)展的語法

使用extension關(guān)鍵字,如下所示趣惠。

extension SomeType{
   //new functionality to add to SomeType goes here
}

extension SomeType: SomeProtocol, AnotherProtocol{
   //implementation of protocol requirements goes here
}

注意:如果你給已經(jīng)存在的類型擴(kuò)展了新的功能狸棍,不管你在什么時(shí)候擴(kuò)展,盡管你是在實(shí)例定義之后再擴(kuò)展的味悄,那么這個(gè)類型所有的實(shí)例都可以使用這個(gè)新功能草戈,

計(jì)算屬性

擴(kuò)展可以給已經(jīng)存在的類型增加計(jì)算實(shí)例屬性和計(jì)算類型屬性,如以下擴(kuò)展了Double類型:

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 / 1000.0 }
   var ft: Double { return self / 3.28084 }
}

let oneInch = 25.4.mm;
print("One inch is \(oneInch)meters")

構(gòu)造方法(Initializers)

可以擴(kuò)展一個(gè)類型實(shí)現(xiàn)自定義構(gòu)造方法侍瑟,但是只能增加便利構(gòu)造方法(Convenience Initializers)唐片,不能增加指定構(gòu)造方法(Designated Initializers)。

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)體沒有自定義的構(gòu)造方法丢习,因?yàn)槠鋵傩远加谐跏贾登4ィ韵到y(tǒng)提供了一個(gè)默認(rèn)構(gòu)造方法和逐一成員構(gòu)造方法,在增加構(gòu)造方法時(shí)咐低,可以調(diào)用逐一成員構(gòu)造方法揽思。要確保類型中所有的存儲(chǔ)屬性都有初始值。

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

}

方法

擴(kuò)展可以增加實(shí)例方法和類型方法,如下所示见擦。

extension Int{

   funcrepetitions(task: () -> Void) {
     for _ in 0..<self {
          task()
       }
    }
}

4.repetitions { //尾隨閉包
   print("hello")
}

可變實(shí)例方法(Mutating Instance Methods)

擴(kuò)展增加的實(shí)例方法可以修改實(shí)例本身钉汗。結(jié)構(gòu)體和枚舉類型中的方法如果想要修改實(shí)例本身或者屬性的話需要用mutating來修飾方法,所以擴(kuò)展這樣的方法也需要加mutating鲤屡。

extension Int{

   mutating func square() {
     self = self * self
     print(self)
    }

}

var someInt = 3
someInt.square()

下標(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

內(nèi)置類型

擴(kuò)展可以給存在的類、結(jié)構(gòu)體和枚舉類型增加新的內(nèi)置類型酒来。

extension Int{
   enumKind {
     casenegative, zero, positive
    }

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

}

func printIntegerKinds(_numbers: [Int]) {
   for number in numbers {
     switch number.kind {
     case .negative:
       print("-", terminator: "")
     case .zero:
       print("0", terminator: "")
     case .positive:
       print("+", terminator: "")
     }
   }
   print("")
}

printIntegerKinds([3, 19, -27, 0, -6, 0, 7])

// Prints "+ + - 0 - 0 +
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卢未,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堰汉,更是在濱河造成了極大的恐慌辽社,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘鸭,死亡現(xiàn)場離奇詭異滴铅,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)就乓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門汉匙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拱烁,“玉大人,你說我怎么就攤上這事噩翠∠纷裕” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵绎秒,是天一觀的道長浦妄。 經(jīng)常有香客問我,道長见芹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任蠢涝,我火速辦了婚禮玄呛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘和二。我一直安慰自己徘铝,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布惯吕。 她就那樣靜靜地躺著惕它,像睡著了一般。 火紅的嫁衣襯著肌膚如雪废登。 梳的紋絲不亂的頭發(fā)上淹魄,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音堡距,去河邊找鬼甲锡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛羽戒,可吹牛的內(nèi)容都是我干的缤沦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼易稠,長吁一口氣:“原來是場噩夢啊……” “哼缸废!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驶社,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤企量,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后衬吆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梁钾,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年逊抡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了姆泻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片零酪。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拇勃,靈堂內(nèi)的尸體忽然破棺而出四苇,到底是詐尸還是另有隱情,我是刑警寧澤方咆,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布月腋,位于F島的核電站,受9級特大地震影響瓣赂,放射性物質(zhì)發(fā)生泄漏榆骚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一煌集、第九天 我趴在偏房一處隱蔽的房頂上張望妓肢。 院中可真熱鬧,春花似錦苫纤、人聲如沸碉钠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喊废。三九已至,卻和暖如春栗弟,著一層夾襖步出監(jiān)牢的瞬間污筷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工横腿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颓屑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓耿焊,卻偏偏與公主長得像揪惦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子罗侯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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

  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,819評論 1 10
  • 132.轉(zhuǎn)換錯(cuò)誤成可選值 通過轉(zhuǎn)換錯(cuò)誤成一個(gè)可選值,你可以使用 try? 來處理錯(cuò)誤器腋。當(dāng)執(zhí)行try?表達(dá)式時(shí),如果...
    無灃閱讀 1,260評論 0 3
  • 常量與變量使用let來聲明常量,使用var來聲明變量钩杰。聲明的同時(shí)賦值的話纫塌,編譯器會(huì)自動(dòng)推斷類型。值永遠(yuǎn)不會(huì)被隱式轉(zhuǎn)...
    莫_名閱讀 451評論 0 1
  • Hello Word 在屏幕上打印“Hello, world”讲弄,可以用一行代碼實(shí)現(xiàn): 你不需要為了輸入輸出或者字符...
    restkuan閱讀 3,188評論 0 6
  • 根據(jù)《重大節(jié)假日免收小型客車通行費(fèi)實(shí)施方案》措左,2016年“五一”假期高速免費(fèi)時(shí)間為4月30日0時(shí)至5月2日24時(shí)。...
    豪車之都閱讀 217評論 0 0