/**
1.擴展語法
2.計算型屬性
3.構造器
4.方法
5.下標
6.嵌套類型
擴展就是向一個已有的類、結構體或枚舉類型添加新功能。包括在沒有權限獲取原始源代碼的情況下擴展類型的能力(即逆向建模)。擴展和OC中的分類(category)類似。不過與OC不同的是,swift的擴展沒有名字。
如果定義一個擴展向已有類型添加新功能,那麼這個心功能對該類型的所有已有實例中都是可用的,即使他們是在換個擴展的前面定義的
*/
//擴展語法
/**
聲明一個擴展使用關鍵字extension
extension SomeType {
// 加到SomeType的新功能寫到這
}
一個擴展可以擴展一個已有類型,使其能夠適配一個或多個協議。當這種情況發生時,接口的名字應該完全按照類或結構體的名字的方式進行書寫
extension SomeType: SomeProtocol, AnotherProctocol {
// 協議實現寫到這
}
按照這種方式添加的協議遵循者被稱之爲在擴中添加協議遵循者
*/
//計算型屬性
/**
擴展可以向已有類型添加計算型實例屬性和計算型類型屬性
*/
extension Double {
var km: Double{
return self * 1000.0;
}
var m: Double {
return self;
}
var cm: Double {
return self / 100.0;
}
var mm: Double {
return self / 1000.0;
}
var ft: Double {
return self / 3.28084;
}
}
let oneInch = 25.4.mm;
print("One inch is \(oneInch) meters");
let threeFeet = 3.ft;
print("Three feet is \(threeFeet) meters");
let aMarathon = 42.km + 195.m;
print("a marathon is \(aMarathon) meters long");
/**
擴展可以添加新的計算屬性,但是不可以添加存儲屬性,也不可以向已有屬性添加屬性觀測器
*/
//構造器
/**
擴展可以向已有類型添加新的構造器。這可以讓你擴展其它類型,將自己的定製類型作爲構造器參數,或者提供該類型的原始實現中沒有包含的額外初始化選項
如果使用擴展向一個值類型添加一個構造器,該構造器向所有的存儲屬性提供默認值,而且沒有定義任何定製構造器,那麼對於來自你的擴展構造器中的值類型,你可以調用默認構造器的成員級構造器,正如在值類型的構造器授權中描述的,如果你已經把構造器寫成值類型原始實現的一部分,上述規則不再使用
*/
struct Size {
var width = 0.0, height = 0.0;
}
struct Point {
var x = 0.0, y = 0.0;
}
struct Rect {
var origin = Point();
var size = Size();
}
let defaultRect = Rect();
//let memberwiseRect = Rect(origin: Point(x: 2.0, y: 2.0), size: Size(width: 5.0, height: 5.0));
extension Rect {
init(center: Point, size: Size) {
let originX = center.x - size.width / 2;
let originY = center.y - size.height / 2;
self.init(origin: Point(x: originX, y: originY), size: size);
}
}
let centerRect = Rect(center: Point(x: 4.0, y: 4.0), size: Size(width: 3.0, height: 3.0));
print("X:\(centerRect.origin.x),Y:\(centerRect.origin.y)\nwidth:\(centerRect.size.width),height:\(centerRect.size.height)");
/**
如果你使用擴展提供了一個新的構造器,你依舊有責任保證構造過程能夠讓所有實例完全初始化
*/
//方法
/**
擴展可以向已有類型添加新的實例方法和類型方法
*/
extension Int {
func repetitons(task: () -> ()) {//表明函數沒有參數而且沒有返回值
for _ in 0..<self {
task();
}
}
}
3.repetitons({
print("hello~");
});
4.repetitons({
print("world!");
});
//修改實例方法
/**
通過擴展添加實例方法也可以修改該實例本身。結構體和枚舉類型中修改self或其屬性的方法必須將該實例方法標註爲mutating,正如來自原始實現的修改方法一樣
*/
extension Int {
mutating func square() -> Int {
return self * self;
}
}
var someInt = 3;
print(someInt.square());
//下標
/**
擴展可以向一個已有類型添加新下標
逆向下標
*/
extension Int {
subscript(digitIndex: Int) -> Int {
var decimalBase = 1;
if digitIndex == 0 {
return self % 10;
}
for _ in 1...digitIndex {
decimalBase *= 10;
}
if self / decimalBase < 1 {
return 0;
}
return (self / decimalBase) % 10;
}
}
print(73456875885[6]);
//嵌套類型
/**
擴展可以向已有的類、結構體和枚舉添加新的嵌套類型
*/
extension Character {
enum Kind {
case Vowel, Consonant, Other;
}
var kind: Kind {
switch String(self).lowercaseString {
case "a","e","i","o","u":
return .Vowel;
case "b","c","d","f","g","h","j","k","l","m","n","p","q":
return .Consonant;
default:
return .Other;
}
}
}
func printLetterKinds(word: String) {
print("\'\(word)' is made up of the following kinds of letters:");
for character in word.characters {
switch character.kind {
case .Vowel:
print("vowel");
case .Consonant:
print("Consonant");
case .Other:
print("other");
}
}
}
printLetterKinds("Hello");