Swift Extension擴(kuò)展得使用詳細(xì)介紹
擴(kuò)展(Extension)
1、Swift中的擴(kuò)展,有點(diǎn)類似于OC中的分類(Category)
2、擴(kuò)展可以為枚舉、結(jié)構(gòu)體、類、協(xié)議添加新功能
可以添加方法、計(jì)算屬性、下標(biāo)、(便捷)初始化器、嵌套類型、協(xié)議等等
3、擴(kuò)展不能辦到的事情
不能覆蓋原有的功能
不能添加存儲(chǔ)屬性,不能向已有的屬性添加屬性觀察器
不能添加父類
不能添加指定初始化器,不能添加反初始化器
。。。。
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、如果希望自定義初始化器的同時(shí),編譯器也能夠生成默認(rèn)初始化器,那么可以在擴(kuò)展中編寫自定義初始化器
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初始化器不能寫在擴(kuò)展中
協(xié)議
1、如果一個(gè)類型已經(jīng)實(shí)現(xiàn)了協(xié)議的所有要求,但是還沒有聲明它遵守了這個(gè)協(xié)議
可以通過擴(kuò)展來讓它遵守這個(gè)協(xié)議
2、給協(xié)議進(jìn)行擴(kuò)展后,凡是遵守了這個(gè)協(xié)議的都會(huì)有對(duì)應(yīng)的擴(kuò)展方法,以下面為例,編寫一個(gè)函數(shù),判斷一個(gè)證書是否為奇數(shù)。
extension BinaryInteger { func isOdd() -> Bool { self % 2 != 0 } }
3、擴(kuò)展可以給協(xié)議提供默認(rèn)實(shí)現(xiàn),也間接實(shí)現(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、擴(kuò)展中依然可以使用原類型中的泛型類型
2、符合條件才擴(kuò)展
extension Stack: Equatable where E: Equatable { }
到此這篇關(guān)于Swift Extension擴(kuò)展得使用詳細(xì)介紹的文章就介紹到這了,更多相關(guān)Swift Extension內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Swift Access Control訪問控制與斷言詳細(xì)介紹
這篇文章主要介紹了Swift Access Control訪問控制與斷言,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-09-09Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解
這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語法,例如常量和變量、注釋、分號(hào)、整數(shù)、數(shù)值類型轉(zhuǎn)換等內(nèi)容,需要的朋友可以參考下2015-01-01在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法
這篇文章主要介紹了在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼的方法,在一個(gè)工程中同時(shí)使用Swift和Objective-C混合語言編程的方法,需要的朋友可以參考下2014-07-07Swift版使用ThPullRefresh實(shí)現(xiàn)下拉上拉刷新數(shù)據(jù)
這篇文章主要介紹了Swift版使用ThPullRefresh實(shí)現(xiàn)下拉上拉刷新數(shù)據(jù),需要的朋友可以參考下2016-01-01在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法
這篇文章主要介紹了在Swift程序中實(shí)現(xiàn)手勢(shì)識(shí)別的方法,蘋果的Swift語言即將進(jìn)入2.0開源階段,人氣爆棚中:D 需要的朋友可以參考下2015-07-07