擴(kuò)展就是向一個(gè)已有的類炬转、結(jié)構(gòu)體辆苔、枚舉類型或協(xié)議類型添加新功能。而且還包括在沒有權(quán)限獲取原始源代碼的情況下擴(kuò)展類型的能力(逆向建模)扼劈。
?swift中的擴(kuò)展可以:
??- 添加計(jì)算型屬性和計(jì)算型靜態(tài)屬性
??- 定義實(shí)例方法和類型方法
??- 提供新的構(gòu)造器
??- 定義下標(biāo)
??- 定義和使用新的嵌套類型
??- 使一個(gè)已有類型符合某個(gè)協(xié)議
?在swift中驻啤,甚至都可以對(duì)一個(gè)協(xié)議進(jìn)行擴(kuò)展,提供協(xié)議需要的實(shí)現(xiàn)荐吵,或添加額外的功能骑冗。
注意: 擴(kuò)展是對(duì)一個(gè)類型添加新的功能,但是不能重寫已有的功能先煎。
一贼涩、擴(kuò)展語法
聲明一個(gè)擴(kuò)展使用關(guān)鍵字extension
:
extension SomeType {
// 加到SomeType的新功能
}
給已有類型擴(kuò)展,是其能夠適配一個(gè)或多個(gè)協(xié)議薯蝎,而這種情況協(xié)議的名字應(yīng)該完全按照類或結(jié)構(gòu)體的名字方式進(jìn)行書寫:
extension SomeType:SomeProtocol, AnotherProctocal {
// 協(xié)議具體實(shí)現(xiàn)
}
二遥倦、計(jì)算型屬性
擴(kuò)展可以向已有類型添加計(jì)算型實(shí)例屬性和計(jì)算型類型屬性:
// 功能: 給系統(tǒng)的Double類型添加3個(gè)計(jì)算型實(shí)例屬性,方便單位的轉(zhuǎn)換占锯,方便閱讀
// 默認(rèn)設(shè)置的米為單位袒哥,即Double型的值1.0,表示就是“1米”
extension Double {
// 千米
var km:Double {
return self * 1_000.0;
}
// 米
var m:Double {
return self;
}
// 厘米
var cm:Double {
return self / 100.0;
}
}
// 身高183cm
let myHeight = 183.cm;
print("我的身高\(yùn)(myHeight.m)米");
輸出結(jié)果:
我的身高1.83米
注意: 擴(kuò)展可以添加新的計(jì)算屬性消略,但不可以添加存儲(chǔ)屬性堡称,也不可以向已有屬性添加屬性觀察器!R杉蟆粮呢!
三、構(gòu)造器
擴(kuò)展可以向已有類型添加新的構(gòu)造器钞艇,這讓可以擴(kuò)展其他類型啄寡,將自己定制類型作為構(gòu)造器參數(shù),或者提供該類型的原始實(shí)現(xiàn)中沒有包含的額外初始化選項(xiàng)哩照。
?擴(kuò)展能向類中添加新的便利構(gòu)造器挺物,但不能向類中添加新的指定構(gòu)造器或析構(gòu)器,即是說指定構(gòu)造器和析構(gòu)器必須總是由原始類實(shí)現(xiàn)來提供飘弧。
/**
矩形結(jié)構(gòu)體Rect
矩形大小結(jié)構(gòu)體Size
矩形位置結(jié)構(gòu)體Point
*/
// 矩形大小
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();
}
// 使用結(jié)構(gòu)體的成員逐一構(gòu)造器
// 矩形是位置在原點(diǎn)(0,0)识藤,大小(3,3)
// 如下圖所示
let myRect = Rect(origin: Point(x: 0.0, y: 0.0),
size: Size(width: 3.0, height: 3.0));
// 給Rect結(jié)構(gòu)體擴(kuò)展一個(gè)構(gòu)造器砚著,使用矩形的中心點(diǎn)和大小表示結(jié)構(gòu)體
extension Rect {
// 中心點(diǎn)center 大小size
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);
}
}
// 位置為(0,0),大小為(4,4),這個(gè)矩形的中心點(diǎn)位置是(2,2)
// 如下圖所示
let myRect = Rect(center: Point(x: 2, y: 2),
size: Size(width: 4, height: 4));
// 驗(yàn)證位置是不是(0,0)
print(myRect.origin.x)
print(myRect.origin.y)
輸出結(jié)果:
0.0
0.0
四、方法
擴(kuò)展可以向已有類型添加新的實(shí)例方法和類型方法:
// 給Int類型擴(kuò)展一個(gè)新實(shí)例方法
extension Int {
// 擴(kuò)展一個(gè)打印遍歷方法
func helloFunc() {
for i in 1...self {
print("\(i)-hello Swift!")
}
}
}
var num:Int = 3;
num.helloFunc();
輸出結(jié)果:
1-hello Swift!
2-hello Swift!
3-hello Swift!
五痴昧、下標(biāo)
擴(kuò)展可以向已有類型添加新下標(biāo):
// 給Int添加一個(gè)下標(biāo)
extension Int {
// 擴(kuò)展下標(biāo)稽穆,獲取數(shù)據(jù)中對(duì)應(yīng)的位數(shù)的數(shù)字
// 例如123, 123[0]表示取出個(gè)位數(shù)字3
// 例如789赶撰, 789[2]表示取出百位數(shù)字7
subscript(var index:Int) -> Int {
// 臨時(shí)變量
var temp = 1;
while index > 0 {
// 是取出第幾位
// 例如取出百位舌镶,temp就是100;取出10位豪娜,temp就為10
temp *= 10;
index -= 1;
}
return (self / temp) % 10;
}
}
var num = 123456;
print(num[0]);
num = 784312312;
print(num[2]);
輸出結(jié)果:
6
3
注:xcode7.3環(huán)境
作者:西門奄
鏈接:http://www.reibang.com/u/77035eb804c3
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有餐胀,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。