一吴藻、值語義
Swift的基本類型(Array暖途,Dictionary, Int, String等)都是用結(jié)構(gòu)體實(shí)現(xiàn)的,都是值類型瘾带。一般應(yīng)該盡量優(yōu)先用struct實(shí)現(xiàn)數(shù)據(jù)建模鼠哥,只有在需要的時候才用class。
如:
import Cocoa
var str = "Hello, playground"
var playgroundGreeting = str
playgroundGreeting += "!How are you today?"
str
改變playgroundGreeting的值看政,str的值不會發(fā)生改變朴恳。
二、引用語義
對于值語義允蚣,把實(shí)例賦給新常量或變量會產(chǎn)生一個副本于颖,把值類型的實(shí)例作為參數(shù)傳遞給函數(shù)也一樣;而引用類型實(shí)例的行為則不同厉萝,會對底層實(shí)例創(chuàng)建新的引用恍飘。
三榨崩、值類型常量和引用類型常量
聲明為常量的值類型不能改變屬性,即使屬性在類型實(shí)現(xiàn)中是用var聲明的也是一樣章母∧钢耄可把值類型的實(shí)例想象成標(biāo)示一個整體的值,就像整數(shù)乳怎。
不能改變聲明為常量的值類型實(shí)例的屬性彩郊,但是可以改變聲明為常量的引用類型實(shí)例的屬性。
四蚪缀、配合使用值類型和引用類型
可以在值類型內(nèi)部使用引用類型秫逝,也可以在引用類型內(nèi)部使用值類型。但是大部分情況下不要在值類型內(nèi)部使用引用類型询枚。若確實(shí)需要在結(jié)構(gòu)體內(nèi)部使用引用類型违帆,最好使用不可變實(shí)例。
五金蜀、復(fù)制
Swift沒有在語言層面提供深復(fù)制的支持刷后,這意味著Swift中的復(fù)制就是淺復(fù)制。淺復(fù)制不會創(chuàng)建實(shí)例的不同副本渊抄,而是復(fù)制這個實(shí)例的引用尝胆。深復(fù)制會復(fù)制引用指向的目標(biāo),但是Swift沒有提供執(zhí)行深復(fù)制的方法护桦,若需要含衔,須自己編寫。
六二庵、相等與同一
理解了值類型和引用類型的區(qū)別贪染,可以再看看相等和同一。相等是指兩個實(shí)例就可見的特征來說具有一樣的值眨猎,比如具有同樣文本的兩個String實(shí)例抑进。同一則是指兩個變量或常量是否指向內(nèi)存中的同一個實(shí)例。
let x = 1
let y = 1
x == y
==相等運(yùn)算符睡陪,Swift中所有的基本數(shù)據(jù)類型(String寺渗、Int、Float兰迫、Double信殊、Array和Dictionary)都可檢查相等性。
===同一運(yùn)算符汁果,可進(jìn)行同一性檢查涡拘。
兩個常量或兩個變量可能相等(具有相同的值)但不同一(指向給定類型的不同實(shí)例);反過來不成立:如果兩個變量或常量指向內(nèi)存中的同一個實(shí)例,那它們一定也相等据德。