我們在swift中最常用的集合型別就是陣列了。陣列,簡單來說,就是一列東西。比如我們可以這樣建立乙個數字的陣列:
let fibs = [0, 1, 1, 2, 3, 5]
複製**
陣列有一些常用操作,比如isempty
和cout
方法1,分別獲取陣列的第乙個和最後乙個元素(除非陣列為空)。陣列還允許使用下標指令碼(subscript),通過指定乙個下標直接訪問元素。但使用下標指令碼是不安全的操作,因為在獲取元素之前,你需要確保下標沒有越界,否則程式就會崩潰。
var mutablefibs = [0, 1, 1, 2, 3, 5]
複製**
這樣就容易在陣列後追加乙個或一組元素了:
複製**
把var
和let
區別開來有很多好處。被定義為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中,我們不需要nsarray
和nsmutablearray
這兩種陣列了,只需要乙個swift自己的陣列便足矣。陣列的可變性由var
和let
關鍵字來決定。與oc不同的是,對某乙個陣列的引用是不會共享的,也就是當你用let
來定義第二個陣列的時候,你可以確保這第二個陣列是不會改變的。
#譯者注
[1]:我覺得嚴格來說是isempty
和cout
屬性的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。若期望駛出的...