原創(chuàng)文章巾钉,歡迎轉(zhuǎn)載。轉(zhuǎn)載請(qǐng)注明:關(guān)東升的博客
可以在原始類型上擴(kuò)展計(jì)算屬性秘案,包括實(shí)例計(jì)算屬性和靜態(tài)計(jì)算屬性砰苍。添加計(jì)算屬性的定義,與普通的計(jì)算屬性的定義是一樣的阱高。
實(shí)例計(jì)算屬性示例:在網(wǎng)絡(luò)編程時(shí)赚导,為了減少流量,從服務(wù)器端返回的不是信息描述赤惊,而是編碼吼旧,然后在本地再將編碼轉(zhuǎn)換為描述信息。為此定義了如下Int類型擴(kuò)展:
extension Int {????//定義Int類型的擴(kuò)展
??? var errorMessage : String {?//只讀計(jì)算屬性
??????? var errorStr = ""
??????? switch (self) {?
??????? case -7:
??????????? errorStr = "沒有數(shù)據(jù)未舟。"
??????? case -6:
??????????? errorStr = "日期沒有輸入圈暗。"
??????? case -5:
??????????? errorStr = "內(nèi)容沒有輸入。"
??????? case -4:
??????????? errorStr = "ID沒有輸入裕膀。"
??????? case -3:
??????????? errorStr = "據(jù)訪問失敗员串。"
??????? case -2:
??????????? errorStr = "您的賬號(hào)最多能插入10條數(shù)據(jù)。"
??????? case -1:
??????????? errorStr = "用戶不存在昼扛,請(qǐng)到http://51work6.com注冊(cè)寸齐。"
??????? default:
??????????? errorStr = ""
??????? }??????
??????? return errorStr
??? }
}
let message = (-7).errorMessage??//獲得-7編碼對(duì)應(yīng)的描述信息
print("Error Code : -7 , Error Message : \(message)")?
注意整個(gè)-7包括負(fù)號(hào)是一個(gè)完整的實(shí)例,因此調(diào)用它的屬性時(shí)需要將-7作為一個(gè)整體用小括號(hào)括起來。然而访忿,如果是7則不需要括號(hào)瞧栗。
下面再看一個(gè)靜態(tài)屬性的示例:
struct Account {????//定義Account結(jié)構(gòu)體
??? var amount : Double = 0.0?????????????? //賬戶金額
??? var owner : String = ""???????????????? //賬戶名
}
extension Account {???//定義Account結(jié)構(gòu)體的擴(kuò)展靜態(tài)
??? static var interestRate : Double {????? //利率?
??? ??return 0.0668
??? }
}
print(Account.interestRate)?//打印輸出interestRate屬性
打印輸出interestRate屬性,訪問方式與其他的靜態(tài)計(jì)算屬性一樣海铆,通過“類型名”加“.”來訪問靜態(tài)計(jì)算屬性迹恐。
擴(kuò)展方法
可以在原始類型上擴(kuò)展方法,包括實(shí)例方法和靜態(tài)方法卧斟。這些添加方法的定義與普通方法的定義是一樣的殴边。
下面先看一個(gè)示例:
extension Double {//定義Double類型的擴(kuò)展
??? static var interestRate : Double = 0.0668 //利率
??? func interestBy1() -> Double {??
??????? return self * Double.interestRate?//靜態(tài)屬性利率
??? }
??? mutating func interestBy2() {??//定義實(shí)例方法interestBy2
??????? self = self * Double.interestRate?
??? }
??? static func interestBy3(amount : Double) -> Double {?//定義靜態(tài)方法interestBy3
??????? return interestRate * amount??//返回值是計(jì)算利息結(jié)果
??? }
}
let interest1 = (10_000.00).interestBy1()?//調(diào)用interestBy1方法計(jì)算利息
print("利息1 : \(interest1)")
var interest2 = 10_000.00?//調(diào)用interestBy2方法計(jì)算利息
interest2.interestBy2()?
print("利息2 : \(interest2)")
var interest3 = Double.interestBy3(10_000.00)?//調(diào)用interestBy3方法計(jì)算利息
print("利息3 : \(interest3)")
代碼self = self * Double.interestRate,把計(jì)算結(jié)果直接賦值給當(dāng)前實(shí)例self珍语。在結(jié)構(gòu)體和枚舉類型中給self賦值會(huì)有編譯錯(cuò)誤锤岸,需要在方法前面加上mutating關(guān)鍵字,表明這是變異方法板乙。
調(diào)用interestBy1方法計(jì)算利息是偷,調(diào)用它的實(shí)例10_000.00,它的返回值被賦值給interest1常量募逞,這是很常見的調(diào)用過程蛋铆。
調(diào)用interestBy2方法計(jì)算利息,我們不能使用10_000.00實(shí)例調(diào)用放接,而是需要一個(gè)Double類型的變量interest2刺啦。interestBy2是變異方法,它會(huì)直接改變變量interest2的值纠脾,因此interest2.interestBy2()語句調(diào)用完成后玛瘸,變量interest2的值就改變了。
調(diào)用interestBy3方法計(jì)算利息苟蹈,它是靜態(tài)方法糊渊,調(diào)用它需要以“類型名.”的方式即“Double.”的方式調(diào)用。