五 Swift學習之擴充套件 Extension

2021-07-01 23:18:01 字數 4682 閱讀 6980

五 swift學習之擴充套件(extensions)

//擴充套件就是向乙個已有的類、結構體或列舉型別新增新功能(functionality)。這包括在沒有許可權獲取原始源**的情況下擴充套件型別的能力(即逆向建模)。擴充套件和 objective-c 中的分類(categories)類似。(不過與objective-c不同的是,swift 的擴充套件沒有名字。)

swift 中的擴充套件可以:

1.新增計算型屬性和計算靜態屬性

2.定義例項方法和型別方法

3.提供新的構造器

4.定義下標

5.定義和使用新的巢狀型別

6.使乙個已有型別符合某個協議

注意:如果你定義了乙個擴充套件向乙個已有型別新增新功能,那麼這個新功能對該型別的所有已有例項中都是可用的,即使它們是在你的這個擴充套件的前面定義的。

一.擴充套件語法(extension syntax)

宣告乙個擴充套件使用關鍵字extension:

extension sometype

乙個擴充套件可以擴充套件乙個已有型別,使其能夠適配乙個或多個協議(protocol)。當這種情況發生時,協議的名字應該完全按照類或結構體的名字的方式進行書寫:

extension sometype: someprotocol, anotherproctocol

按照這種方式新增的協議遵循者(protocol conformance)被稱之為在擴充套件中新增協議遵循者

二.計算型屬性(computed properties)

擴充套件可以向已有型別新增計算型例項屬性和計算型型別屬性。

swift 的內建double型別新增了5個計算型例項屬性,從而提供與距離單位協作的基本支援。

extension double

var m : double

var cm: double

var mm: double

var ft: double

}let oneinch = 25.4.mm

println("one inch is \(oneinch) meters")

// 列印輸出:"one inch is 0.0254 meters"

let threefeet = 3.ft

println("three feet is \(threefeet) meters")

// 列印輸出:"three feet is 0.914399970739201 meters"

這些計算屬性表達的含義是把乙個double型的值看作是某單位下的長度值。即使它們被實現為計算型屬性,但這些屬性仍可以接乙個帶有.語法的浮點型字面值,而這恰恰是使用這些浮點型字面量實現距離轉換的方式。

在上述例子中,乙個double型的值1.0被用來表示「1公尺」。這就是為什麼m計算型屬性返回self——表示式1.km被認為是計算1.0的double值(1*1000)這些屬性是唯讀的計算型屬性,所有從簡考慮它們不用get關鍵字表示。它們的返回值是double型,而且可以用於所有接受double的數學計算中:

let amarathon = 42.km + 195.m

println("a marathon is \(amarathon) meters long")

// 列印輸出:"a marathon is 42195.0 meters long"

注意:擴充套件可以新增新的計算屬性,但是不可以新增儲存屬性,也不可以向已有屬性新增屬性觀測器(property observers)。

三.構造器(initializers)

擴充套件可以向已有型別新增新的構造器。這可以讓你擴充套件其它型別,將你自己的定製型別作為構造器引數,或者提供該型別的原始實現中沒有包含的額外初始化選項。擴充套件能向類中新增新的便利構造器,但是它們不能向類中新增新的指定構造器或析構函式。指定構造器和析構函式必須總是由原始的類實現來提供。

注意:如果你使用擴充套件向乙個值型別新增乙個構造器,在該值型別已經向所有的儲存屬性提供預設值,而且沒有定義任何定製構造器(custom initializers)時,你可以在值型別的擴充套件構造器中呼叫預設構造器(default initializers)和逐一成員構造器(memberwise initializers)。正如在值型別的構造器**中描述的,如果你已經把構造器寫成值型別原始實現的一部分,上述規則不再適用。

下面的例子定義了乙個用於描述幾何矩形的定製結構體rect。這個例子同時定義了兩個輔助結構體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的原點是 (2.5, 2.5),大小是 (3.0, 3.0)

注意:如果你使用擴充套件提供了乙個新的構造器,你依舊有責任保證構造過程能夠讓所有例項完全初始化。

四.方法(methods)

擴充套件可以向已有型別新增新的例項方法和型別方法。下面的例子向int型別新增乙個名為repetitions的新例項方法:

extension int )

// hello!

//可以使用 trailing 閉包使呼叫更加簡潔:

3.repetitions

// goodbye!

五.修改例項方法(mutating instance methods)

通過擴充套件新增的例項方法也可以修改該例項本身。結構體和列舉型別中修改self或其屬性的方法必須將該例項方法標註為mutating,正如來自原始實現的修改方法一樣。

下面的例子向swift的int型別新增了乙個新的名為square的修改方法,來實現乙個原始值的平方計算:

extension int

// 立方

mutating func cube()

}var someint = 3

someint.square()

someint.cube()

// someint 現在值是 9

六.下標(subscripts)

擴充套件可以向乙個已有型別新增新下標。這個例子向swift內建型別int新增了乙個整型下標。該下標[n]返回十進位制數字從右向左數的第n個數字

123456789[0]返回9

123456789[1]返回8

extension int

return (self / decimalbase) % 10

}}746381295[0]

// returns 5

746381295[1]

// returns 9

746381295[2]

// returns 2

746381295[8]

// returns 7

注意點:如果該int值沒有足夠的位數,即下標越界,那麼上述實現的下標會返回0,因為它會在數字左邊自動補0:

746381295[9]

//returns 0, 即等同於:

0746381295[9]

七.巢狀型別(nested types)

擴充套件可以向已有的類、結構體和列舉新增新的巢狀型別:

extension character

var kind: kind

}}該例子向character新增了新的巢狀列舉。這個名為kind的列舉表示特定字元的型別。具體來說,就是表示乙個標準的拉丁指令碼中的字元是母音還是子音(不考慮口語和地方變種),或者是其它型別。

這個例子還向character新增了乙個新的計算例項屬性,即kind,用來返回合適的kind列舉成員。

現在,這個巢狀列舉可以和乙個character值聯合使用了:

func printletterkinds(word: string)

}print("\n")

}printletterkinds("hello")

// 'hello' is made up of the following kinds of letters:

// consonant vowel consonant consonant vowel

函式printletterkinds的輸入是乙個string值並對其字元進行迭代。在每次迭代過程中,考慮當前字元的kind計算屬性,並列印出合適的類別描述。所以printletterkinds就可以用來列印乙個完整單詞中所有字母的型別,正如上述單詞"hello"所展示的。

注意:由於已知character.kind是character.kind型,所以character.kind中的所有成員值都可以使用switch語句裡的形式簡寫,比如使用 .vowel代替character.kind.vowel

Swift之UIColor 擴充套件

通常uicolor自帶的一些方法在實際專案開發中不能滿足我們的需求,所以把一些常用到的方法在這裡進行乙個歸類 import foundation import uikit extension uicolor rgbred 0 255 同理green blue convenience init rgb...

Swift學習之五 Bool型別

swift中的基本型別bool,bool值是邏輯值,因為bool值只能是true或者是false值。如 true是乙個關鍵字,不能像c那樣用非0表示true let orangesareorange true false是乙個關鍵字,不能使用0來表示false let trunipsaredelic...

swift學習記錄(擴充套件)

擴充套件就是向乙個已有的類 結構體 列舉型別或者協議型別新增新功能。基本 語法 使用關鍵字extension來宣告乙個擴充套件 extension 型別名 擴充套件可以 1 新增計算性屬性 和 靜態計算性屬性 extension double var m double var cm double v...