宣告擴充套件的語法格式如下:
extension 型別名
宣告擴充套件的關鍵字是extension,「型別名」是swift中已有的型別,包括類、結構體和列舉,但是我們仍然可以擴充套件整型、浮點型、布林型、字串等基本資料型別,這是因為這些型別本質上也是結構體型別。開啟int的定義如下:
struct int : signedinteger
static var min: int
}
從定義可見int是結構體型別。不僅是int型別,我們熟悉的整型、浮點型、布林型、字串等資料型別本質上都是結構體型別。
swift中的擴充套件機制可以在原始型別中新增的新功能包括:
還有巢狀型別等內容也可以擴充套件,擴充套件還可以遵從協議。
可以在原始型別上擴充套件計算屬性,包括例項計算屬性和靜態計算屬性。新增計算屬性的定義,與普通的計算屬性的定義是一樣的。
例項計算屬性示例:在網路程式設計時,為了減少流量,從伺服器端返回的不是資訊描述,而是編碼,然後在本地再將編碼轉換為描述資訊。為此定義了如下int型別擴充套件:
[html]view plain
copy
?extension int
return errorstr
} }
let message = (-7).errormessage //獲得-7編碼對應的描述資訊
print("error code : -7 , error message : \(message)")
注意整個-7包括負號是乙個完整的例項,因此呼叫它的屬性時需要將-7作為乙個整體用小括號括起來。然而,如果是7則不需要括號。
下面再看乙個靜態屬性的示例:
[html]view plain
copy
?struct account
extension account
} print(account.interestrate) //列印輸出interestrate屬性
列印輸出interestrate屬性,訪問方式與其他的靜態計算屬性一樣,通過「型別名」加「.」來訪問靜態計算屬性。
擴充套件方法
可以在原始型別上擴充套件方法,包括例項方法和靜態方法。這些新增方法的定義與普通方法的定義是一樣的。
下面先看乙個示例:
[html]view plain
copy
?extension double
mutating func interestby2()
static func interestby3(amount : double) -> double
} let interest1 = (10_000.00).interestby1() //呼叫interestby1方法計算利息
print("利息1 : \(interest1)")
var interest2 = 10_000.00 //呼叫interestby2方法計算利息
interest2.interestby2()
print("利息2 : \(interest2)")
var interest3 = double.interestby3(10_000.00) //呼叫interestby3方法計算利息
print("利息3 : \(interest3)")
**self = self *double.interestrate,把計算結果直接賦值給當前例項self。在結構體和列舉型別中給self賦值會有編譯錯誤,需要在方法前面加上mutating關鍵字,表明這是變異方法。
呼叫interestby1方法計算利息,呼叫它的例項10_000.00,它的返回值被賦值給interest1常量,這是很常見的呼叫過程。
呼叫interestby2方法計算利息,我們不能使用10_000.00例項呼叫,而是需要乙個double型別的變數interest2。interestby2是變異方法,它會直接改變變數interest2的值,因此interest2.interestby2()語句呼叫完成後,變數interest2的值就改變了。
呼叫interestby3方法計算利息,它是靜態方法,呼叫它需要以「型別名.」的方式即「double.」的方式呼叫。
擴充套件型別的時候,也可以新增新的建構函式。值型別與引用型別擴充套件有所區別。值型別包括了除類以外的其他型別,主要是列舉型別和結構體型別。
值型別擴充套件建構函式
擴充套件結構體型別中定義建構函式的示例:
[html]view plain
copy
print?
struct rectangle
} extension rectangle
} var rect = rectangle(width : 320.0, height : 480.0) //呼叫兩個引數的建構函式,這個建構函式是原始型別提供, rectangle型別已經是擴充套件型別
print("長方形:\(rect.width) x \(rect.height)")
var square = rectangle(length: 500.0) //呼叫乙個引數的建構函式,這個建構函式是擴充套件型別提供的
print("正方形:\(square.width) x \(square.height)")
self.init是呼叫了原始型別的兩個引數的建構函式。
引用型別擴充套件建構函式
擴充套件類中定義建構函式的示例:
[html]view plain
copy
print?
class person
init (name : string, age : int)
} extension person
} let p1 = person(name : "mary") //呼叫兩個引數的建構函式,這個建構函式是原始型別提供,這時候的person型別已經是擴充套件型別。
print("person1 : \(p1.description())")
let p2 = person(name : "tony", age : 28)// 呼叫乙個引數的建構函式建立person例項,這個建構函式是擴充套件型別提供的。
print("person2 : \(p2.description())")
**self.init(name :name, age : 8)呼叫指定建構函式**部分構造任務。
Swift 可選鏈 備
在swift程式表示式中會看到問號 和感嘆號 它們代表什麼含義呢?這些符號都與可選型別和可選鏈相關,下面來看看可選鏈。可選鏈 類圖 它們之間是典型的關聯關係類圖。這些類一般都是實體類,實體類是系統中的人 事 物。employee通過dept屬性與department關聯,department通過co...
swift字典集合 備
swift字典表示一種非常複雜的集合,允許按照某個鍵來訪問元素。字典是由兩部分集合構成的,乙個是鍵 key 集合,乙個是值 value 集合。鍵集合是不能有重複元素的,而值集合是可以重複的,鍵和值是成對出現的。字典宣告與初始化 swift字典型別是dictionary,也是乙個泛型集合。在宣告乙個d...
swift 擴充套件
擴充套件就是為乙個已有類 結構體 列舉型別或者協議型別新增新功能。這包括在沒有許可權獲取原始源 的情況下擴充套件型別的能力。擴充套件和objectvie從中的分類類似。swift中的擴充套件可以 新增計算型別屬性和計算型型別屬性 定義例項方法和型別方法 提供新的構造器 定義下標 定義和使用新的巢狀型...