Swift 擴充套件宣告 備

2021-09-07 06:27:21 字數 3366 閱讀 3213

宣告擴充套件的語法格式如下:

extension 型別名

宣告擴充套件的關鍵字是extension,「型別名」是swift中已有的型別,包括類、結構體和列舉,但是我們仍然可以擴充套件整型、浮點型、布林型、字串等基本資料型別,這是因為這些型別本質上也是結構體型別。開啟int的定義如下:

struct int : signedinteger   

static var min: int   

}  

從定義可見int是結構體型別。不僅是int型別,我們熟悉的整型、浮點型、布林型、字串等資料型別本質上都是結構體型別。

swift中的擴充套件機制可以在原始型別中新增的新功能包括:

還有巢狀型別等內容也可以擴充套件,擴充套件還可以遵從協議。

可以在原始型別上擴充套件計算屬性,包括例項計算屬性和靜態計算屬性。新增計算屬性的定義,與普通的計算屬性的定義是一樣的。

例項計算屬性示例:在網路程式設計時,為了減少流量,從伺服器端返回的不是資訊描述,而是編碼,然後在本地再將編碼轉換為描述資訊。為此定義了如下int型別擴充套件:

[html]view plain

copy

print

?extension int                 

return errorstr  

}  }  

let message = (-7).errormessage      //獲得-7編碼對應的描述資訊  

print("error code : -7 , error message : \(message)")    

注意整個-7包括負號是乙個完整的例項,因此呼叫它的屬性時需要將-7作為乙個整體用小括號括起來。然而,如果是7則不需要括號。

下面再看乙個靜態屬性的示例:

[html]view plain

copy

print

?struct account   

extension account   

}  print(account.interestrate)  //列印輸出interestrate屬性  

列印輸出interestrate屬性,訪問方式與其他的靜態計算屬性一樣,通過「型別名」加「.」來訪問靜態計算屬性。

擴充套件方法

可以在原始型別上擴充套件方法,包括例項方法和靜態方法。這些新增方法的定義與普通方法的定義是一樣的。

下面先看乙個示例:

[html]view plain

copy

print

?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中的擴充套件可以 新增計算型別屬性和計算型型別屬性 定義例項方法和型別方法 提供新的構造器 定義下標 定義和使用新的巢狀型...