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.dmvar 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解決UITableView空數(shù)據(jù)視圖問題的簡(jiǎn)單方法
這篇文章主要給大家介紹了關(guān)于Swift解決UITableView空數(shù)據(jù)視圖問題的簡(jiǎn)單方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2018-10-10
Swift 基本數(shù)據(jù)類型詳解總結(jié)
在我們使用任何程序語言編程時(shí),需要使用各種數(shù)據(jù)類型來存儲(chǔ)不同的信息。變量的數(shù)據(jù)類型決定了如何將代表這些值的位存儲(chǔ)到計(jì)算機(jī)的內(nèi)存中。在聲明變量時(shí)也可指定它的數(shù)據(jù)類型。所有變量都具有數(shù)據(jù)類型,以決定能夠存儲(chǔ)哪種數(shù)據(jù)2021-11-11
Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法示例
最近學(xué)完了swift想著實(shí)踐下,就通過一些簡(jiǎn)單的算法進(jìn)行學(xué)習(xí)研究,下面這篇文章主要介紹了Swift算法實(shí)現(xiàn)字符串轉(zhuǎn)數(shù)字的方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)示例詳解
這篇文章主要介紹了switch多選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu),本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
深入理解Swift中單例模式的替換及Swift 3.0單例模式的實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于Swift中單例模式替換的相關(guān)資料,然后又跟大家分享了關(guān)于Swift3.0 單例模式實(shí)現(xiàn)的幾種方法-Dispatch_Once的內(nèi)容,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11
Swift仿選擇電影票的效果并實(shí)現(xiàn)無限/自動(dòng)輪播的方法
這篇文章主要給大家介紹了關(guān)于Swift仿選擇電影票的效果并實(shí)現(xiàn)無限/自動(dòng)輪播的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08

