第三章 集合(陣列與可變性)

2021-09-11 10:11:05 字數 2196 閱讀 3971

我們在swift中最常用的集合型別就是陣列了。陣列,簡單來說,就是一列東西。比如我們可以這樣建立乙個數字的陣列:

let fibs = [0, 1, 1, 2, 3, 5]

複製**

陣列有一些常用操作,比如isemptycout方法1,分別獲取陣列的第乙個和最後乙個元素(除非陣列為空)。陣列還允許使用下標指令碼(subscript),通過指定乙個下標直接訪問元素。但使用下標指令碼是不安全的操作,因為在獲取元素之前,你需要確保下標沒有越界,否則程式就會崩潰。

var mutablefibs = [0, 1, 1, 2, 3, 5]

複製**

這樣就容易在陣列後追加乙個或一組元素了:

複製**

varlet區別開來有很多好處。被定義為let的變數不能被改變,因此它更容易理解。當你讀到類似於let fibs = ……的時候,你就知道編譯器會保證fibs的值永遠不會變。這極大的幫助我們通讀整篇**。需要注意的是當變數表示乙個物件時,它的值是乙個指標。用let來定義乙個物件可以保證這個指標所指向的記憶體位址是不變的,但是它指向的記憶體中的資料是可能會改變的(也就是說例項變數)2。我們會在第四章中更加深入的理解結構體和類的區別。

swift中的陣列有自己的值語義。具體說來就是陣列中的值從來不會共享。當建立乙個新的陣列變數,然後把舊的陣列賦值給它時,其實是把舊的陣列變數複製了乙份,把陣列作為引數傳給函式中也是如此。比如在下面的**段中,x不會被修改。

var x = [1,2,3]

var y = x

複製**

var y = x這句**把x複製了乙份,所以在y的末尾追加乙個4不會對x有任何影響,x的值依然是[1,2,3]

對比一下nsarray採用的實現可變性的方法,nsarray沒有變異方法(mutating method),需要用nsmutablearray來讓乙個陣列變成可變的。

但只是有乙個不可變的nsarray引用並不意味著陣列就不能在你眼皮子底下被改變。

let a = nsmutablearray(array: [1,2,3])

// 我不想讓b能被改變

let b: nsarray = a

// 但其實b還是可以被改變 —— 通過a

a.insertobject(4, atindex:3)

// 現在b也含有4了

print(b)

複製**

正確的做法是在建立b的時候把a拷貝乙份:

let a = nsmutablearray(array: [1,2,3])

// 我不想讓b能被改變

let b: nsarray = a.copy() as! nsarray

a.insertobject(4, atindex:3)

print(b) // b現在依然還是[1,2,3]

複製**

在上面的例子中,我們顯然需要把a複製乙份,因為畢竟a自己是可變的。雖然在方法間傳遞陣列的情況不太常見、但這會導致很多不必要的複製。

在swift中,我們不需要nsarraynsmutablearray這兩種陣列了,只需要乙個swift自己的陣列便足矣。陣列的可變性由varlet關鍵字來決定。與oc不同的是,對某乙個陣列的引用是不會共享的,也就是當你用let來定義第二個陣列的時候,你可以確保這第二個陣列是不會改變的。

#譯者注

[1]:我覺得嚴格來說是isemptycout屬性的get方法。

[2]:也就說object.attribute = newvalue可以,而object = newobject不可以。

第三章 集合 可變引數

可變引數 1 a 可變引數概述 定義方法的時候不知道該定義多少個引數 b 格式 修飾符 返回值型別 方法名 資料型別 變數名 c 注意事項 這裡的變數其實是乙個陣列 如果乙個方法有可變引數,並且有多個引數,那麼,可變引數肯定是最後乙個 2 示例 如下 package com.jh.www publi...

python學習 第三章 集合

1.0 集合 1.1集合的寫法 方法 一 s set 1,2,3,4,5,6,7 方法二 list 1,2,3,4,5,6 a set list 1.2 集合的關係測試 s1 set 1,3,5,7 list 2,4,6,7 s2 set list 求交集 print s1.intersection...

第三章 棧 佇列 陣列

1.假設棧初始為空,將中綴表示式 這題和上題區別就是rear指向隊尾元素,而不是隊尾元素的下乙個元素 4.設有下圖所示的火車車軌,入口到出口之間有n條軌道,列車的行進方向均為從左至右,列車可駛入任意一條軌道。現有編號為1 9的9列列車,駛入的次序依次是8,4,2,5,3,9,1,6,7。若期望駛出的...