Swift(十四)類和結構體

e28d38185d2247ea1c0e1ef5e0ecb5a3c030af1591d1c-a6qT3U_fw658.png

在swift中, 結構體被重新定義, 它用于很多類所擁有的功能, 幾乎可以和類媲美, 但是在存儲數(shù)據(jù)方面有區(qū)別, 類是引用類型, 結構體是值類型, 所以要根據(jù)存儲數(shù)據(jù)的類型和使用環(huán)境來選擇不同的數(shù)據(jù)結構

類和結構體定義

struct Resolution { 
    var width = 0 
    var heigth = 0  //賦初值
} 
class VideoMode { 
    var resolution = Resolution() 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String?  //name屬性會被自動賦予一個默認值nil钉蒲,意為“沒有name值”仿滔,因它是一個可選類型与柑。
} 

生成結構體和類實例的語法非常相似:

let someResolution = Resolution() 
let someVideoMode = VideoMode() 

結構體和類的訪問和OC一樣, 都可以通過.語法,訪問屬性和子屬性

someVideoMode.resolution.width //使用點語法訪問
someVideoMode.resolution.width = 1024 //使用點語法賦值

注意:與 Objective-C 語言不同的是,Swift 允許直接設置結構體屬性的子屬性了赌。上面的最后一個例子,就是直接設置了someVideoMode中resolution屬性的width這個子屬性囤热,以上操作并不需要從新設置resolution屬性僵缺。記不記得在OC當中, 你如果要修改一個結構體,, 例如CGRect, 你不可以直接修改frame.origin.y的值, 而是需要構造一個新的CGRect, 然后把這個修改好的CGRect賦值給原來的CGrect

CGRect frame;
frame.origin.x = 100; //這樣是修改不了的

結構體和枚舉是值類型

在 Swift 中,所有的基本類型:整數(shù)(Integer)食绿、浮點數(shù)(floating-point)侈咕、布爾值(Booleans)、字符串(string)器紧、數(shù)組(array)和字典(dictionaries)乎完,都是值類型,并且都是以結構體的形式在后臺所實現(xiàn)品洛。
在 Swift 中,所有的結構體和枚舉都是值類型摩桶。這意味著它們的實例桥状,以及實例中所包含的任何值類型屬性,在代碼中傳遞的時候都會被復制硝清。

let tenEighty = VideoMode() //創(chuàng)建一個類并賦值給tenEighty
tenEighty.frameRate = 25.0 //修改tenEighty. tenEighty.frameRate的值
let alsoTenEighty = tenEighty //把tenEighty賦值給一個新的常量
alsoTenEighty.frameRate = 30.0 //使用新的常量修改frameRate的值
print(tenEighty.frameRate) //30.0 

需要注意的是tenEighty和alsoTenEighty被聲明為常量(let)而不是變量辅斟。然而你依然可以改變tenEighty.frameRate和alsoTenEighty.frameRate,因為這兩個常量本身不會改變。它們并不儲存這個VideoMode實例芦拿,在后臺僅僅是對VideoMode實例的引用士飒。修改其中一個的值會影響到另外一個, 由此可證明, 他們使用的是同一份數(shù)據(jù), 即引用的是同一個對象. 所以查邢,改變的是被引用的基礎VideoMode的frameRate參數(shù),而不改變常量的值.(這一點與OC不同)

    Person *p = [[Person alloc] init];
    p.name = @"小米";
    Person *p1 = p;
    p1.name = @"大米";
    NSLog(@"%@, %@", p1.name, p.name); //大米, 大米

類和結構體的選擇

在你的代碼中酵幕,你可以使用類和結構體來定義你的自定義數(shù)據(jù)類型扰藕。

然而,結構體實例總是通過值傳遞芳撒,類實例總是通過引用傳遞邓深。這意味兩者適用不同的任務。當你的在考慮一個工程項目的數(shù)據(jù)構造和功能的時候笔刹,你需要決定每個數(shù)據(jù)構造是定義成類還是結構體芥备。

按照通用的準則,當符合一條或多條以下條件時舌菜,請考慮構建結構體:

結構體的主要目的是用來封裝少量相關簡單數(shù)據(jù)值萌壳。

有理由預計一個結構體實例在賦值或傳遞時,封裝的數(shù)據(jù)將會被拷貝而不是被引用日月。

任何在結構體中儲存的值類型屬性袱瓮,也將會被拷貝,而不是被引用山孔。

結構體不需要去繼承另一個已存在類型的屬性或者行為懂讯。

集合(Collection)類型的賦值和拷貝行為

Swift 中數(shù)組(Array)和字典(Dictionary)類型均以結構體的形式實現(xiàn)。然而當數(shù)組被賦予一個常量或變量台颠,或被傳遞給一個函數(shù)或方法時褐望,其拷貝行為與字典和其它結構體有些許不同。

以下對數(shù)組和結構體的行為描述與對NSArray和NSDictionary的行為描述在本質上不同串前,后者是以類的形式實現(xiàn)瘫里,前者是以結構體的形式實現(xiàn)。NSArray和NSDictionary實例總是以對已有實例引用,而不是拷貝的方式被賦值和傳遞荡碾。

注意:以下是對于數(shù)組谨读,字典,字符串和其它值的拷貝的描述坛吁。 在你的代碼中劳殖,拷貝好像是確實是在有拷貝行為的地方產生過。然而拨脉,在Swift 的后臺中哆姻,只有確有必要,實際(actual)拷貝才會被執(zhí)行玫膀。Swift 管理所有的值拷貝以確保性能最優(yōu)化的性能矛缨,所以你也沒有必要去避免賦值以保證最優(yōu)性能。(實際賦值由系統(tǒng)管理優(yōu)化)

var a = [1, 2, 3] 
var b = a 
var c = a 
a[0] = 42 
//修改原來的值, 不會對其他的值產生影響, 字典同樣
println(a[0]) // 42  
println(b[0]) // 1
println(c[0]) //1
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市箕昭,隨后出現(xiàn)的幾起案子灵妨,更是在濱河造成了極大的恐慌,老刑警劉巖落竹,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泌霍,死亡現(xiàn)場離奇詭異,居然都是意外死亡筋量,警方通過查閱死者的電腦和手機烹吵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桨武,“玉大人肋拔,你說我怎么就攤上這事⊙剿幔” “怎么了凉蜂?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長性誉。 經常有香客問我窿吩,道長,這世上最難降的妖魔是什么错览? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任纫雁,我火速辦了婚禮,結果婚禮上倾哺,老公的妹妹穿的比我還像新娘轧邪。我一直安慰自己,他們只是感情好羞海,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布忌愚。 她就那樣靜靜地躺著,像睡著了一般却邓。 火紅的嫁衣襯著肌膚如雪硕糊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天腊徙,我揣著相機與錄音简十,去河邊找鬼。 笑死撬腾,一個胖子當著我的面吹牛勺远,可吹牛的內容都是我干的。 我是一名探鬼主播时鸵,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了饰潜?” 一聲冷哼從身側響起初坠,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彭雾,沒想到半個月后碟刺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡薯酝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年半沽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴菠。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡者填,死狀恐怖,靈堂內的尸體忽然破棺而出做葵,到底是詐尸還是另有隱情占哟,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布酿矢,位于F島的核電站榨乎,受9級特大地震影響,放射性物質發(fā)生泄漏瘫筐。R本人自食惡果不足惜蜜暑,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望策肝。 院中可真熱鬧肛捍,春花似錦、人聲如沸驳糯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝高。三九已至,卻和暖如春逢慌,著一層夾襖步出監(jiān)牢的瞬間帘睦,已是汗流浹背袍患。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竣付,地道東北人诡延。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像古胆,于是被迫代替她去往敵國和親肆良。 傳聞我的和親對象是個殘疾皇子筛璧,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內容