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)槠鋵傩远加谐跏贾?,所以系統(tǒng)提供了一個(gè)默認(rèn)構(gòu)造方法和逐一成員構(gòu)造方法,在增加構(gòu)造方法時(shí),可以調(diào)用逐一成員構(gòu)造方法。要確保類型中所有的存儲屬性都有初始值。

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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容