Swift 擴(kuò)展

擴(kuò)展就是向一個(gè)已有的類(lèi)草慧、結(jié)構(gòu)體或枚舉類(lèi)型添加新功能。
擴(kuò)展可以多一個(gè)類(lèi)型添加新的功能吸祟,但是不能重寫(xiě)已有的功能

Swift中擴(kuò)展可以:

  • 添加計(jì)算型屬性和計(jì)算型靜態(tài)屬性
  • 定義實(shí)例方法和類(lèi)型方法
  • 提供新的構(gòu)造器
  • 定義下標(biāo)
  • 定義和使用新的嵌套類(lèi)型
  • 使一個(gè)已有類(lèi)型符合某個(gè)協(xié)議
語(yǔ)法

擴(kuò)展聲明使用關(guān)鍵字 extension:

extension SomeType {
    /// 加到SomeType的新功能寫(xiě)在這里
}

一個(gè)擴(kuò)展可以擴(kuò)展一個(gè)已有類(lèi)型瑟慈,使其能夠適配一個(gè)或多個(gè)協(xié)議,語(yǔ)法格式如下:

extension SomeType: SomeProtocol,AntherProtocol {
    /// 協(xié)議寫(xiě)在這里
}
計(jì)算型屬性

擴(kuò)展可以向已有類(lèi)型添加計(jì)算型實(shí)例屬性和計(jì)算型屬性屋匕。

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.add
print("加法運(yùn)算后的值:\(addition)")
    
let subtraction = 120.sub
print("減法運(yùn)算后的值:\(subtraction)")
    
let multiplication = 39.mul
print("乘法運(yùn)算后的值:\(multiplication)")
    
let division = 55.div
print("除法運(yùn)算后的值: \(division)")

let mix = 30.add + 34.sub
print("混合運(yùn)算結(jié)果:\(mix)")

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

加法運(yùn)算后的值:103
減法運(yùn)算后的值:110
乘法運(yùn)算后的值:390
除法運(yùn)算后的值: 11
混合運(yùn)算結(jié)果:154
構(gòu)造器

擴(kuò)展可以向已有類(lèi)型添加新的構(gòu)造器葛碧、
這可以讓你擴(kuò)展其他類(lèi)型,將你自己的定制類(lèi)型作為構(gòu)造器參數(shù)过吻,或者提供該類(lèi)型的原始實(shí)現(xiàn)中沒(méi)有包含的額外初始化選項(xiàng)进泼。
擴(kuò)展可以向類(lèi)中添加新的便利構(gòu)造器 init(),但是它們不能向類(lèi)中添加新的指定構(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)")

輸出結(jié)果為:

getMult sum(100, 200)
getMult diff(200, 100)
方法

擴(kuò)展可以向已知類(lèi)添加新的實(shí)例方法和類(lèi)方法。
下面雷子向Int類(lèi)型中添加一個(gè)名為topics的新的實(shí)例方法:

extension Int {
   func topics(summation: () -> ()) {
      for _ in 0..<self {
         summation() 
      }
   }
}  

4.topics({
   print("擴(kuò)展模塊內(nèi)")       
})    
    
3.topics({
   print("內(nèi)型轉(zhuǎn)換模塊內(nèi)")       
})  

以上輸出程序?yàn)椋?/p>

擴(kuò)展模塊內(nèi)
擴(kuò)展模塊內(nèi)
擴(kuò)展模塊內(nèi)
擴(kuò)展模塊內(nèi)
內(nèi)型轉(zhuǎn)換模塊內(nèi)
內(nèi)型轉(zhuǎn)換模塊內(nèi)
內(nèi)型轉(zhuǎn)換模塊內(nèi)

這個(gè)topics的方法使用了一個(gè) ()-> ()類(lèi)型的單參數(shù),表明函數(shù)沒(méi)有參數(shù)而且沒(méi)有返回值乳绕。
定義擴(kuò)展后绞惦,你就可以對(duì)任意整數(shù)調(diào)用tipics方法,實(shí)現(xiàn)的功能則是多次只信某任務(wù)

可變實(shí)例方法

通過(guò)擴(kuò)展添加的實(shí)例方法也可以修改實(shí)力本身洋措、翩隧。
結(jié)構(gòu)體和枚舉類(lèi)型中修改self或其他屬性的方法必須將該實(shí)例方法標(biāo)注為mutating,正如來(lái)自原始實(shí)現(xiàn)的修改方法一樣。
下面的例子向 Swift 的 Double 類(lèi)型添加了一個(gè)新的名為 square 的修改方法呻纹,來(lái)實(shí)現(xiàn)一個(gè)原始值的平方計(jì)算:

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

程序輸出結(jié)果為

圓的面積為: 34.210935
圓的面積為: 105.68006
圓的面積為: 45464.070735
下標(biāo)

擴(kuò)展可以向一個(gè)已有類(lèi)型添加新下標(biāo)
以下例子向 Swift 內(nèi)建類(lèi)型Int添加了一個(gè)整型下標(biāo)。該下標(biāo)[n]返回十進(jì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])

以上程序輸出為:

2
6
5
嵌套類(lèi)型

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

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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雷酪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子涝婉,更是在濱河造成了極大的恐慌哥力,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件墩弯,死亡現(xiàn)場(chǎng)離奇詭異吩跋,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)渔工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)锌钮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人引矩,你說(shuō)我怎么就攤上這事梁丘。” “怎么了旺韭?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵氛谜,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我区端,道長(zhǎng)值漫,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任织盼,我火速辦了婚禮杨何,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悔政。我一直安慰自己晚吞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布谋国。 她就那樣靜靜地躺著槽地,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上捌蚊,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天集畅,我揣著相機(jī)與錄音,去河邊找鬼缅糟。 笑死挺智,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窗宦。 我是一名探鬼主播赦颇,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赴涵!你這毒婦竟也來(lái)了媒怯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤髓窜,失蹤者是張志新(化名)和其女友劉穎扇苞,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(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
  • 文/蒙蒙 一绷杜、第九天 我趴在偏房一處隱蔽的房頂上張望直秆。 院中可真熱鬧,春花似錦鞭盟、人聲如沸圾结。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)筝野。三九已至晌姚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歇竟,已是汗流浹背挥唠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(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)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學(xué)習(xí)記錄文檔别瞭,今天18年5月份再次想寫(xiě)文章腌紧,發(fā)現(xiàn)簡(jiǎn)書(shū)還為我保存起的...
    Jenaral閱讀 2,756評(píng)論 2 9
  • (轉(zhuǎn)載自http://letsswift.com/2014/06/extensions/) 擴(kuò)展就是向一個(gè)已有的類(lèi)...
    StrongX閱讀 1,608評(píng)論 0 11
  • 擴(kuò)展 就是為一個(gè)已有的類(lèi)、結(jié)構(gòu)體畜隶、枚舉類(lèi)型或者協(xié)議類(lèi)型添加新功能。這包括在沒(méi)有權(quán)限獲取原始源代碼的情況下擴(kuò)展類(lèi)型的...
    CDLOG閱讀 165評(píng)論 0 0
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,805評(píng)論 1 10
  • 擴(kuò)展介紹 擴(kuò)展 就是為一個(gè)已有的類(lèi)号胚、結(jié)構(gòu)體籽慢、枚舉類(lèi)型或者協(xié)議類(lèi)型添加新功能。這包括在沒(méi)有權(quán)限獲取原始源代碼的情況下...
    666真666閱讀 309評(píng)論 0 1