Swift和Objective-C中的類型

iOS開發(fā)中使用的類型

Foundation中的類型可以分為三類:

  1. NSInteger等,在C語言中嬉挡,枚舉類型钝鸽、字符型和各種整數(shù)的表示形式統(tǒng)一叫做標(biāo)量類型
  2. immutable類型,如:NSString等
  3. mutable類型庞钢,如:NSMutableString等

如果使用了Swift那么還需要了解Swift標(biāo)準(zhǔn)庫中的類型可分類為:

  1. 值類型拔恰,如struct,enum基括,tuple
  2. 引用類型颜懊,即class

OC中的基本類型例如NSString等都是使用的引用類型,而Swift中大多是使用的值類型

Swift的值類型與引用類型

  1. 在Swift中struct為值類型风皿,在此處值類型(Value Types)的定義為:每個(gè)實(shí)例都保留其數(shù)據(jù)的唯一副本(each instance keeps a unique copy of its data)
// Value type example
struct S { var data: Int = -1 }
var a = S()
var b = a                       // a is copied to b
a.data = 42                     // Changes a, not b
print("\(a.data), \(b.data)")   // prints "42, -1"
swift struct
  1. 在Swift中class和引用類型(Reference Types)是一一對應(yīng)的關(guān)系河爹,定義為:實(shí)例共享數(shù)據(jù)的單個(gè)副本(each instance keeps a unique copy of its data)
// Reference type example
class C { var data: Int = -1 }
var x = C()
var y = x                       // x is copied to y
x.data = 42                     // changes the instance referred to by x (and y)
print("\(x.data), \(y.data)")   // prints "42, 42"

與OC中區(qū)分最大的是Swift的有值類型的存在,下面將僅討論Swift值類型與OC中的引用類型

可變與不可變類型

OC中可變與不可變使用mutable和immutable來表示桐款,而在Swift中使用let和var來表示咸这,但是Swift中關(guān)于可變與不可變的描述更加符合使用的直覺

// OC 
// str所指向的內(nèi)存區(qū)域內(nèi)容是不可變的,但是str指向的位置是可變的
NSString *str = [[NSString alloc] init];
// 簡單類比一下C++
const char *str


// Swift
// str 指向的內(nèi)存區(qū)域的內(nèi)容是不可變的且str指向的位置是不可變的
let str = String("")
str.append("a") // 編譯錯(cuò)誤
str = "a"   // 編譯錯(cuò)誤
// 簡單類比下C++
const char * const str

在函數(shù)傳參時(shí):

// case 1:
// Swift
func doSomething(str: String) {
    // 編譯錯(cuò)誤
    str = ""
}
// OC 
-(void) doSomething: (NSString*)str
// 類比C++魔眨,指向的內(nèi)存區(qū)域和指針都是常量
void doSomething(const char * str)

// case 2:
func doSomething(str: inout S) {
    // 編譯通過
    str = ""
}
// OC
-(void) doSomething: (NSMutableString**)str
// 類比C++媳维,指向的內(nèi)存區(qū)域和指針都是變量
void doSomething(char **str)

OC中不可變類型的copy僅僅是增加對象的引用計(jì)數(shù),并將指針指向原來的內(nèi)存區(qū)域遏暴,這么做可以提高效率侄刽,減少內(nèi)存占用,Swift為了效率對值類型也有優(yōu)化(寫時(shí)復(fù)制):

var str = ""
// 此時(shí)str1和str指向同一塊內(nèi)存
var str1 = str

// 此時(shí)才會copy
// 修改str1后將會先開辟一塊新的內(nèi)存朋凉,將原來的內(nèi)容copy過去唠梨,然后再append
str1.append("a")

總結(jié)

我認(rèn)為,Swift把所有的基本類型定義為值類型是更加符合我們的使用習(xí)慣的侥啤,大多數(shù)情況下,我們更多的是在使用純函數(shù)茬故,我們不希望改變傳遞進(jìn)來的參數(shù)盖灸,但是要在OC中實(shí)現(xiàn)這個(gè)功能要時(shí)刻關(guān)注類型是否Mutable,而且還要關(guān)注指針的值是否可變磺芭,在Swift中一個(gè)inout關(guān)鍵字就對OC來說是好多種情況赁炎,而Swift直觀的用let和var就統(tǒng)一的表達(dá)了這些語義。

引用

蘋果官方blog:"Value and Reference Types"

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市徙垫,隨后出現(xiàn)的幾起案子讥裤,更是在濱河造成了極大的恐慌,老刑警劉巖姻报,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件己英,死亡現(xiàn)場離奇詭異,居然都是意外死亡吴旋,警方通過查閱死者的電腦和手機(jī)损肛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門荣瑟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來治拿,“玉大人,你說我怎么就攤上這事笆焰∪侣樱” “怎么了叠国?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵冤狡,是天一觀的道長。 經(jīng)常有香客問我合瓢,道長晴楔,這世上最難降的妖魔是什么税弃? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任则果,我火速辦了婚禮遗增,結(jié)果婚禮上做修,老公的妹妹穿的比我還像新娘缓待。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布答姥。 她就那樣靜靜地躺著尚粘,像睡著了一般郎嫁。 火紅的嫁衣襯著肌膚如雪泽铛。 梳的紋絲不亂的頭發(fā)上盔腔,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼链烈。 笑死强衡,一個(gè)胖子當(dāng)著我的面吹牛缩搅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亿傅,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼葵擎,長吁一口氣:“原來是場噩夢啊……” “哼酬滤!你這毒婦竟也來了镜沽?” 一聲冷哼從身側(cè)響起嘴脾,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤拇颅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后竿刁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搪缨,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡队腐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年千绪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡偶翅,死狀恐怖滞诺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朵耕,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布友存,位于F島的核電站,受9級特大地震影響陶衅,放射性物質(zhì)發(fā)生泄漏屡立。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一搀军、第九天 我趴在偏房一處隱蔽的房頂上張望膨俐。 院中可真熱鬧,春花似錦罩句、人聲如沸焚刺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乳愉。三九已至,卻和暖如春诅福,著一層夾襖步出監(jiān)牢的瞬間匾委,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工氓润, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赂乐,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓咖气,卻偏偏與公主長得像挨措,于是被迫代替她去往敵國和親挖滤。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容