類是引用類型
與值的類型不同,引用類型被賦予到一個(gè)變量,常量或者被傳遞到一個(gè)函數(shù)時(shí)功炮,其值不會(huì)被拷貝,因此术唬,引用的是存在的的實(shí)例本身不是其拷貝薪伏。
let tenEight = VideoMode()
tenEight.resolution = hd
tenEight.interlaced = true
tenEight.name = "1080i"
tenEight.frameRate = 25.0
let alsoTenEight = tenEight
alsoTenEight.frameRate = 30.0
print("The frameRate property of tenEight is now \(tenEight.frameRate)")
//The frameRate property of tenEight is now 30.0"
聲明了一個(gè)名為tenEight的常量,引用的是VideoMode的新實(shí)例粗仓。tenEight被賦予名為alsoTenEight的新常量嫁怀,同時(shí)對(duì)alsoTenEight的frameRate進(jìn)行修改,我們可以看見(jiàn)tenEight的frameRate也被修改了借浊,這說(shuō)明了tenEight和alsoTenEight實(shí)際上引用的是相同的VideoMode實(shí)例塘淑,換句話說(shuō)這是同一個(gè)實(shí)例的兩種叫法。
注意:
我們可以看見(jiàn)這兩個(gè) tenEight蚂斤,alsoTenEight被聲明的是常量而不是變量存捺,但是我們依然可以改變alsoTenEight.frameRate的值,這是因?yàn)閠enEight和alsoTenEight這兩個(gè)常量的值并沒(méi)有改變曙蒸,他們并不“存儲(chǔ)”這個(gè)VideoMode實(shí)例捌治,而僅僅是對(duì)VideoMode的引用,所以改變的十被引用的VideoMode的frameRate的屬性纽窟,不是引用VideoMode的常量的值肖油。
總結(jié)
也就是說(shuō)枚舉和結(jié)構(gòu)體是值類型,我們修改了其值师倔,其他被傳遞給的變量构韵、常量、函數(shù)值不會(huì)變化趋艘,因?yàn)槭菍?duì)那個(gè)值的拷貝疲恢;類是引用類型,我們修改了一處瓷胧,其他引用同一個(gè)實(shí)例的地方显拳,都會(huì)相應(yīng)的變化
恒等運(yùn)算符
swift中內(nèi)建了兩個(gè)恒等運(yùn)算符,用來(lái)檢測(cè)兩個(gè)常量或者變量是否引用同一個(gè)實(shí)例:
- 等價(jià)于(===)
- 不等價(jià)于(!==)
if tenEight === alsoTenEight {
println("tenEight and alsoTenEight refer to the same Resolution instance.")
}
//打印出tenEight and alsoTenEight refer to the same Resolution instance.
類和結(jié)構(gòu)體的選擇
結(jié)構(gòu)體實(shí)例總是通過(guò)值傳遞搓萧,類的實(shí)例是通過(guò)類的引用傳遞杂数,兩者的運(yùn)用場(chǎng)景是不同的,按照通用的準(zhǔn)則瘸洛,當(dāng)符合一條或者多條的時(shí)候請(qǐng)選擇結(jié)構(gòu)體:
- 該數(shù)據(jù)結(jié)構(gòu)的主要目的是用來(lái)封裝少量的相關(guān)的簡(jiǎn)單數(shù)據(jù)
- 有理由預(yù)計(jì)該數(shù)據(jù)結(jié)構(gòu)的實(shí)例在被賦值的時(shí)候或者傳遞的時(shí)候揍移,封裝的數(shù)據(jù)將會(huì)被拷貝而不是被引用
- 該數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)的值類型屬性,應(yīng)用該被拷貝反肋,而不是被引用那伐。
- 該數(shù)據(jù)結(jié)構(gòu)不需要繼承另一個(gè)既有類型的屬性或者行為
字符串(String)、數(shù)組(Array)、和字典(Dictionary)類型的賦值與復(fù)制行為
swift中罕邀,許多基本類型畅形,比如String,Array诉探,Dictonary類型均以結(jié)構(gòu)體的形式實(shí)現(xiàn)日熬,這意味著被賦值給新的常量或者變量,或者被傳入函數(shù)或者方法中時(shí)肾胯,他們的值被拷貝竖席。
Object-C中的NSString、NSArray和NSDictionary類型都是以類的形式實(shí)現(xiàn)的敬肚,所以他們?cè)诒毁x值或者被傳入函數(shù)或者方法的時(shí)候怕敬,不會(huì)發(fā)生拷貝,而是傳遞現(xiàn)有實(shí)例的引用帘皿。