擴展就是向一個已有的類、結構體或枚舉類型添加新功能,這包括在沒有權限獲取原始源代碼的狀況下擴展類型的能力。
擴展和 Objective-C
中的分類(category
)相似,可是它要比分類強大的多,它不只能夠擴展類,還能夠擴展協議、枚舉、結構體,另外擴展也不侷限於擴展方法,還能夠擴展便利構造方法、計算屬性、下標腳本等php
//使用擴展須要使用到extension關鍵字,這裏的SomeType能夠是類、結構體、枚舉、協議等類型 extension SomeType{ //添加到SomeType的新功能寫在這裏 } //一個擴展能夠擴展一個已有類型,使其可以適配一個或多個協議 extension SomeType: SomeProtocol, AnotherProctocol { // 協議實現寫到這裏 }
//擴展系統結構體Double,添加計算屬性 extension Double { var km: Double { return self * 1_000.0 } //計算只讀屬性的簡化寫法 var m : Double { return self } var cm: Double { return self / 100.0 } var mm: Double { return self / 1_000.0 } var ft: Double { return self / 3.28084 } } var inch:Double = 25.4 let oneInch = inch.mm print("One inch is \(oneInch) meters") // 打印輸出:One inch is 0.0254 meters var feet:Double = 3.0 let threeFeet = feet.ft print("Three feet is \(threeFeet) meters") // 打印輸出:Three feet is 0.914399970739201 meters
注意:
擴展能夠添加新的計算屬性,可是不能夠添加存儲屬性,也不能夠向已有屬性添加屬性觀測器。git
//向Int類型添加一個名爲repetitions的新實例方法,接受一個空參數無返回值的函數類型參數 extension Int { func repetitions(task: () -> ()) { //重複執行自己值次數的函數 for _ in 0..<self { task() } } //擴展類型方法 static func number()->[Int]{ return [1, 2, 3] } } var value:Int = 3 value.repetitions({ print("Hello World") }) /* 打印: Hello World Hello World Hello World */ value.repetitions{//尾閉包簡化 print("extension") } /* 打印: extension extension extension */ print(Int.number())//打印:[1, 2, 3]
//定義一個類 class Person { var firstName:String var lastName:String var age:Int = 0 var fullName:String{ get{ return firstName + " " + lastName } } init(firstName:String, lastName:String){ self.firstName = firstName self.lastName = lastName } } //擴展該類,擴展便利構造器方法 extension Person{ //類類型只能擴展便利構造方法,不能擴展指定構造方法 convenience init(){ self.init(firstName:"", lastName:"") } } var p = Person() p.firstName = "Liu" p.lastName = "Ting" p.age = 22 print(p.fullName) //打印:Liu Ting /* 擴展結構體 */ 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() } //默認構造器方法 let defaultRect = Rect() //成員逐一構造器方法 let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0)) //擴展結構體 extension Rect { //這個新的構造器會根據提供的center和size值計算一個合適的原點。 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的原點是 (2.5, 2.5),大小是 (3.0, 3.0)
//爲系統類型Int添加擴展 extension Int { //擴展下標腳本,獲取對應下標位數的數字 subscript(digitIndex: Int) -> Int { var decimalBase = 1 for _ in 0..<digitIndex { decimalBase *= 10 } return (self / decimalBase) % 10 } } var value:Int = 1234567 print(value[0]) //結果:7 print(value[1]) //結果:6 print(value[2]) //結果:5 print(value[3]) //結果:4
//爲系統類型Character添加擴展 extension Character { //擴展嵌套類型,表示元音、輔音、其餘 enum Kind { case Vowel, Consonant, Other } //擴展計算屬性 var kind: Kind { //轉爲小寫後進行元輔音匹配 switch String(self).lowercaseString { case "a", "e", "i", "o", "u": return .Vowel case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m", "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z": return .Consonant default: return .Other } } } var word = "Hello" //遍歷字符串的全部字符 for character in word.characters { switch character.kind { case .Vowel: //由於kind屬性指定了類型,是Character.Kind.Vowel的簡化 print("\(character)是元音") case .Consonant: print("\(character)是輔音") case .Other: print("\(character)是其餘") } } /* 打印: H是輔音 e是元音 l是輔音 l是輔音 o是元音 */
靈活使用Swift的擴展,能夠提升咱們的編碼效率,就像咱們在OC中積累項目經驗,有一些東西會已分類的形式進行積累,能夠方便咱們移植到其餘項目中,提升咱們的效率,Swift擴展就是比這個更增強大的存在,沒理由不用編程
提供一個好用的在線Swift編譯網站:Swift在線編程swift