iOS Swift No 20 擴充套件

2021-10-24 00:22:41 字數 4768 閱讀 4845

擴充套件 (extensions) - 就是給現有的類,結構體,列舉或者協議型別新增新的功能。包括沒有讀取許可權的情況下獲取原始源**的擴充套件型別的能力(逆向建模),swift中的擴充套件和oc裡面的分類較為相似,但與oc裡的分類不同的是swift裡面的擴充套件沒有名字。

擴充套件在swift裡有下面這些功能:

新增計算型例項屬性和計算型型別屬性

add computed instance properties and computed type properties

定義例項方法和型別方法

define instance methods and type methods

提供新的構造器

provide new initializers

定義下標

define subscripts

定義和使用新的巢狀型別

define and use new nested types

確定已有的型別的某個協議

make an existing type conform to a protocol

在swift語言裡面,我們甚至可以對協議進行擴充套件,提供協議要求的實現,或者新增額外的功能,從而可以讓符合協議的型別擁有這些功能,詳請見協議擴充套件章節。

用extension關鍵字宣告擴充套件;

extension

sometype

通過擴充套件可以來擴充乙個已有的型別,使這個型別採用乙個或多個協議並確認這個協議的一致性,我們可以通過擴充套件來和寫類和結構體那樣來寫乙個協議名稱。

extension

sometype

:someprotocol

,anotherprotocol

新增來確認協議的一致性將會在相關章節詳細介紹,也可以擴充套件某個已有的泛型,將會在擴充套件乙個泛型裡面有詳細介紹,還可以有條件的新增乙個功能來擴充套件該已有的泛型都將會在相關章節中有詳細介紹。

擴充套件可以給現有的型別新增計算型例項屬性和計算型型別屬性,下面這個例子就是擴充套件給swift裡面的double型別新增的五個計算型例項屬性,從而來提供多長度單位最基本的支援。

extension

double

var m:

double

var cm:

double

var mm:

double

var ft:

double

}// inch:英吋 foot:英呎

let oneinch =

25.4

.mm // 用dot語法呼叫mm方法

print

("one inch is \(oneinch)

meters"

)// 輸出:one inch is 0.0254 meters

let threefeet =

3.ft

print

("three feet is \(threefeet)

meters"

)// 輸出:three feet is 0.914399970739201 meters

這三種計算型屬性的表達把double的值看作某個長度單位來計算。即使它們作為乙個計算型屬性來實現的,這些屬性的名字還可以用dot語法來表達乙個浮點型的值。從而來實現長度單位的轉換。

這些屬性是乙個唯讀的計算型屬性,所以它們可以不需要get關鍵字來表達。double型別是這些屬性的返回值型別,同樣可以用數學計算的方法來實現double型別值的計算。

// 型別不相同也可以用來計算,因為它們呼叫的dot語法已經對長度單位不一致的情況作出了轉換。

let amarathon =

42.km +

195.m

print

("a marathon is \(amarathon)

meters long"

)// 輸出:a marathon is 42195.0 meters long

擴充套件可以在已存在的型別中新增乙個新的構造器,使我們用此來擴充套件其它型別,將你自己的定製型別作為其構造器引數,或者提供該型別的原始實現中未提供的額外初始化選項。

擴充套件可以使我們給乙個類新增乙個新的便利構造器,但是不能給這個類新增新的指定構造器和析構器,置頂構造器和析構器只能新增在原有類的實現裡面。

下面這個例子是定義了乙個自定義的結構體,用來表示這個這個幾何長方形。該例子同樣定義了兩個支援結構體size和point,兩個支援結構體都有乙個0.0的預設值。

struct

size

struct

point

struct

rect

因為該結構體rect提供的是預設值,所以它會自動接收預設構造器和成員逐一構造器。這些構造器用來建立這個新的rect例項。

let defaultrect =

rect()

let memberwiserect =

rect

(origin:

point

(x:2.0

, y:

2.0)

, size:

size

(width:

5.0, height:

5.0)

)

同樣可一擴充套件結構體rect可以提供乙個額外的構造器,

extension

rect

}

這個新的構造器首先根據提供的center和size的值計算乙個合適的原點。然後呼叫該結構體的成員逐一構造器init(origin:size:),該構造器將新的原點和大小的值儲存到了相應的屬性中:

let centerrect =

rect

(center:

point

(x:4.0

, y:

4.0)

, size:

size

(width:

3.0, height:

3.0)

)// centerrect's origin is (2.5, 2.5) and its size is (3.0, 3.0)

擴充套件可以為已有的型別新增新的例項方法和型別方法,下面這個例子就是給例項方法repetitions新增乙個int型別。

extension

int}

}

這個repetitions(task:)方法使用的是乙個單一的的引數() -> void,這個表明了這個函式沒有引數並且不會返回值。

在定義完這個擴充套件之後,我們可以以任何乙個int的值來呼叫repetitions(task:)方法用來執行多少次的這個任務。

// 三次呼叫repetitions方法

3.repetitions

新增了擴充套件的例項方法可以修改例項本身,修改self或者屬性的結構體和列舉方法都必須要用mutating關鍵字來標記這個例項方法。就像在原實現中標記方法那樣。

下面這個例子是給swift的int型別新增乙個可變的方法square

extension

int}

var someint =

3someint.

square()

// someint is now 9

擴充套件同樣也可以給現有的型別新增乙個下標,下面這個例子就是新增乙個int型別下標給swift的int型別,下標[n]返回十進位制數字從右向左數的第n個數字:

extension

intreturn

(self

/ decimalbase)%10

}}746381295[0

]// returns 5

746381295[1

]// returns 9

746381295[2

]// returns 2

746381295[8

]// returns 7

擴充套件可以為已有的類,結構體,或者列舉新增乙個新的巢狀型別。

extension

intvar kind:

kind

}}

這個例子是給int新增了乙個巢狀列舉。該列舉kind表達的特定整數的型別。具體來說,就是表示整數是正 數、零或者負數。這個例子同樣給int新增了乙個新的計算型例項屬性,為這個整數返回的是乙個適當的kind列舉

現在可以用溫和乙個int的值在巢狀列舉中。

func

printintegerkinds

(_ numbers:

[int])

}print(""

)}printintegerkinds([

3,19,

-27,0

,-6,

0,7]

)// 輸出:+ + - 0 - 0 +

這個函式printintegerkinds(_:)採用了乙個int值的輸入陣列,然後進行迭代,每乙個在陣列中的int值,函式為這個kind的計算型屬性採用的是整數值。並輸出合適的表述。

為AS2 0添磚加瓦 編寫類擴充套件

1b 序 1b 基於類的程式設計,使得我們可以更加輕鬆地定製屬於自己的物件,同時也給已有類的擴充套件提供了極大的方便。現在我們可以通過extends關鍵字實現繼承,並通過import來匯入位於其他.as檔案中的類。在這些基礎之上,我們完全可以發展自己的想象力,改進已有的as,使之成為一款適合自己的指...

EXT2 0 checkbox樹的擴充套件

ext2.0 checkbox樹的擴充套件 支援單選,級聯多選,只選葉子等 在ext1.x裡,樹是沒有checkbox的,幸好在2.x版本裡提供了這個功能,在許多應用裡,帶有checkbox的樹使用還是很常見的 ext2.x提供了簡單的checkbox實現,但對於一些複雜的需求,如 級聯多選 選中父...

鬼臉原創 谷歌擴充套件 知乎V2 0

目的 用鍵盤替代滑鼠,做乙個安靜刷知乎的美男 女 子!功能 功能 按鍵 說明 直接定位到搜尋框 q開啟 首頁 w開啟 話題 e開啟 發現 r開啟 訊息 m開啟 個人主頁 u開啟 我的草稿 c開啟 我的收藏 s開啟 關注的問題 g開啟 邀請我回答的問題 y開啟當前可見範圍內的第乙個問題 回車 僅針對 ...