Struct概述 Swift語言有兩種基本的數據類型,即類(class)和結構體(struct),class這樣的概念你們不會陌生,而struct也並非什麼新的概念,在Objective-C和C++也有struct,不過swift將struct提高到一個更高更重要的層次,甚至swift Foundation框架的SDK,諸如String,Array,Dictionary都是基於struct實現的。 筆者剛開始接觸swift時,認爲struct是一個附屬品,然而隨着開發的深刻和閱讀代碼量的上升,發現struct的使用場景不少,並且很好用。 那麼struct與class相比,有什麼區別呢?主要的區別就在於class是類型引用,而struct是值引用,在Objective-C時代,咱們對類型引用和值引用就有了必定的瞭解,例如在Objective-C中經常使用的NSArray, NSDictionary, NSString, UIKit等都是類型引用;而NSInteger, CGFloat, CGRect等則是值引用。顯然,在Objective-C中,引用類型佔據了很大的比重,如今使用swift開發應用程序,開發者須要轉變觀念,由於struct在swift變得愈來愈重要,觀念的轉變不只在於多使用struct,還要求開發者理解struct的原理,優勢及缺點。 在swift中,類型引用和值引用的區別在於,對於類型引用(class reference),將變量a賦值給變量b,即b = a,這樣的賦值語句僅僅將b的指針與a的指針同樣,指向同一塊內存區域,此時改變b的值,a也會跟着改變;而對於值引用(value reference),賦值語句b = a處理的過程是開闢一個新的內存b,將a變量的內容拷貝後存放到內存b,這時a和b徹底沒有關係的兩個變量,對b的改變不會影響到a,反之亦然。 下面運行於demo說明了class的類型引用和struct的值引用的區別, class demo編程
class somtTemp{
var someString:String
init(someString:String) {
self.someString = someString
}
}
var classB = somtTemp(someString: "123")
var classC = classB
print("第一次賦值---\(classB.someString)-------\(classC.someString)")
classC.someString = "43211"
print("第二次賦值---\(classB.someString)-------\(classC.someString)")
複製代碼
結果: swift
用圖解釋一下: 數組
struct demo安全
struct somtTemp{
var someString:String
init(someString:String) {
self.someString = someString
}
}
var classB = somtTemp(someString: "123")
var classC = classB
print("第一次賦值---\(classB.someString)-------\(classC.someString)")
classC.someString = "43211"
print("第二次賦值---\(classB.someString)-------\(classC.someString)")
複製代碼
結果: bash
圖解: 框架
struct和class的主要區別,ui
* struct是值引用,而class是類型引用
* struct沒有繼承的功能,class有繼承功能
複製代碼
首先說第一點區別,從swift的更新和struct不斷完善來看,蘋果公司更加推薦使用struct來代替class,由於struct值引用和class類型引用這點區別,保證使用struct編碼能寫出更加安全可靠的代碼。爲何這樣說呢,class類型引用在賦值時是將變量指向了同一塊內存地址,這在一個長時間的跨度上會帶來一些意想不到的問題,試想一個簡單的例子,viewControllerA持有一個NSMutableArray數組mutalbeArray,它包含100條user信息,此時將mutableArray賦值給viewControllerB,對於viewControllerB而言,它僅僅須要前10條user信息,因此它將mutableArray多餘的信息刪除了,這樣一個腦殘的操做致使了viewControllerA模塊展現錯誤和潛在的邏輯錯誤。而使用struct值引用則不會出現這樣的問題。編碼
第二點區別,struct沒有繼承的功能,這是由於swift在本質上來講是面向協議(Protocol Oriented)的語言,struct沒有也不須要繼承的功能,爲了實現某個功能,struct去服從並實現某個協議就便可,從一個較高的層次來看,struct+protocol是構成swift面向協議語言的兩個基石。這一點不在本文討論範圍,再也不贅述。 爲何要使用struct呢?總結就是struct能夠保證代碼更加安全可靠,以及struct+protocol更加切合swift面向協議編程的初衷。spa