五 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...