天天看點

Swift Struct Class

struct 字段

在大多數語言中 struct 字段被用來定義結構體,在swift 中也一樣,被定義額結構體,但是swift中的struct更強大,突然發現在swift中Sting類其實是個結構體,甚至swift Foundation架構的SDK,諸如String,Array,Dictionary都是基于struct實作的。如圖:

Swift Struct Class

( ⊙ o ⊙ )是的你沒看錯,在String結構體中定義了**init()**方法,應該說這是與其他語言的結構體非常不同的地方了。但是,swift中的結構體struct 同樣不支援繼承多态。

在swift中,類型引用和值引用的差別在于,對于類型引用(class reference),将變量a指派給變量b,即b = a,這樣的指派語句僅僅将b的指針與a的指針一樣,指向同一塊記憶體區域,此時改變b的值,a也會跟着改變;而對于值引用(value reference),指派語句b = a處理的過程是開辟一個新的記憶體b,将a變量的内容拷貝後存放到記憶體b,這時a和b完全沒有關系的兩個變量,對b的改變不會影響到a,反之亦然

如下圖所示:struct 定義的 benren 、gongsi兩個結構體變量

可以看到值引用的具體表現

Swift Struct Class

struct和class這兩個基本層面的差別,展現了差別于Objective-C語言,swift語言帶來了全新的天翻地覆的改變。

首先說第一點差別,從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面向協定程式設計的初衷。