Swift Extension擴展得使用詳細介紹
擴展(Extension)
1、Swift中的擴展,有點類似于OC中的分類(Category)
2、擴展可以為枚舉、結(jié)構(gòu)體、類、協(xié)議添加新功能
可以添加方法、計算屬性、下標、(便捷)初始化器、嵌套類型、協(xié)議等等
3、擴展不能辦到的事情
不能覆蓋原有的功能
不能添加存儲屬性,不能向已有的屬性添加屬性觀察器
不能添加父類
不能添加指定初始化器,不能添加反初始化器
。。。。
extension Double { var km: Double { self * 1_000.0 } var m: Double { self } var dm: Double { self / 100.0 } var cm: Double { self / 10.0 } var mm: Double { self / 1_000.0 } } var d = 100.0 d.km d.m d.dm
var arr: Array<Int> = [10, 20, 30] extension Array { subscript(nullable idx: Int) -> Element? { if (startIndex ..< endIndex).contains(idx) { return self[idx] } return nil } } print(arr[nullable: 1] ?? 0)
extension Int { func repeats(task: () -> Void) { for _ in 0..<self { task() } } enum Kind { case negative, zero, positive } var kind: Kind { switch self { case 0: return .zero case let x where x > 0: return.positive default: return .negative } } subscript(digitIndex: Int) -> Int { var decimalBase = 1 for _ in 0..<digitIndex { decimalBase *= 10 } return (self / decimalBase) % 10 } }
協(xié)議與初始化器
class Person { var age: Int var name: String init(age: Int, name: String) { self.age = age self.name = name } } extension Person: Equatable { static func == (left: Person, right: Person) -> Bool { left.age == right.age && left.name == right.name } convenience init() { self.init(age: 0, name: "") } }
1、如果希望自定義初始化器的同時,編譯器也能夠生成默認初始化器,那么可以在擴展中編寫自定義初始化器
struct Point { var x: Int = 0 var y: Int = 0 } extension Point { init(_ point: Point) { self.init(x: point.x, y: point.y) } }
2、required初始化器不能寫在擴展中
協(xié)議
1、如果一個類型已經(jīng)實現(xiàn)了協(xié)議的所有要求,但是還沒有聲明它遵守了這個協(xié)議
可以通過擴展來讓它遵守這個協(xié)議
2、給協(xié)議進行擴展后,凡是遵守了這個協(xié)議的都會有對應(yīng)的擴展方法,以下面為例,編寫一個函數(shù),判斷一個證書是否為奇數(shù)。
extension BinaryInteger { func isOdd() -> Bool { self % 2 != 0 } }
3、擴展可以給協(xié)議提供默認實現(xiàn),也間接實現(xiàn) 可選協(xié)議 的效果
protocol TestProtocol { func test1() } extension TestProtocol { func test1() { print("TestProtocol test1") } func test2() { print("TestProtocol test2") } } class TestClass: TestProtocol { func test1() { print("TestClass test1") } func test2() { print("TestClass test2") } } var cls: TestProtocol = TestClass() cls.test1() //TestClass test1 cls.test2() //TestProtocol test2
泛型
1、擴展中依然可以使用原類型中的泛型類型
2、符合條件才擴展
extension Stack: Equatable where E: Equatable { }
到此這篇關(guān)于Swift Extension擴展得使用詳細介紹的文章就介紹到這了,更多相關(guān)Swift Extension內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swift Access Control訪問控制與斷言詳細介紹
這篇文章主要介紹了Swift Access Control訪問控制與斷言,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-09-09Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解
這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下2015-01-01在一個項目中同時使用Swift和Objective-C代碼混合編程的方法
這篇文章主要介紹了在一個項目中同時使用Swift和Objective-C代碼的方法,在一個工程中同時使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下2014-07-07Swift版使用ThPullRefresh實現(xiàn)下拉上拉刷新數(shù)據(jù)
這篇文章主要介紹了Swift版使用ThPullRefresh實現(xiàn)下拉上拉刷新數(shù)據(jù),需要的朋友可以參考下2016-01-01