Swift基礎(chǔ)-數(shù)組橙依、字典、集合硕旗、枚舉

數(shù)組(Arrays)

數(shù)組是存儲為單個值的值的集合窗骑。例如,John漆枚,Paul创译,George和Ringo是名字,但是數(shù)組使您可以將它們分組為一個名為The Beatles的單一值墙基。

在代碼中软族,我們這樣寫:

let john = "John Lennon"
let paul = "Paul McCartney"
let george = "George Harrison"
let ringo = "Ringo Starr"

let beatles = [john, paul, george, ringo]

最后一行構(gòu)成數(shù)組:它以方括號開頭和結(jié)尾,數(shù)組中的每個項目均以逗號分隔残制。

您可以通過在方括號內(nèi)寫一個數(shù)字來從數(shù)組中讀取值立砸。數(shù)組位置從0開始計數(shù),因此初茶,如果您想閱讀“ Paul McCartney”颗祝,可以這樣寫:

beatles[1]

請注意:如果您閱讀不存在的項目,Swift就會崩潰。例如螺戳,嘗試閱讀beatles[9]不是一個好主意搁宾。

注:如果您使用類型注釋,陣列都寫在括號:[String]温峭,[Int]猛铅,[Double],和[Bool]凤藏。

集合(Sets)

集合是值的集合奸忽,就像數(shù)組一樣,區(qū)別在于它們有兩個區(qū)別:

  • 1.物品不會以任何順序存儲揖庄;它們以有效的隨機順序存儲栗菜。
  • 2.一組物品不能出現(xiàn)兩次。所有項目必須唯一蹄梢。

您可以直接從數(shù)組創(chuàng)建集合疙筹,如下所示:

let colors = Set(["red", "green", "blue"])

當(dāng)您查看colors在Playground輸出中的值時,您會發(fā)現(xiàn)它與我們用來創(chuàng)建它的順序不匹配禁炒。它不是真正的隨機順序而咆,只是無序的 – Swift不保證其順序。由于它們是無序的幕袱,因此無法像使用數(shù)組一樣使用數(shù)字位置從集合中讀取值暴备。

如果您嘗試將重復(fù)項插入到集合中,則重復(fù)項將被忽略们豌。例如:

let colors2 = Set(["red", "green", "blue", "red", "blue"])

最終colors2設(shè)置將僅包含紅色涯捻,綠色和藍(lán)色一次。

元組(Tuples)

元組允許您將多個值一起存儲在一個值中望迎。這聽起來像數(shù)組障癌,但是元組不同:

  • 1.您不能在元組中添加或刪除項目;它們的大小是固定的辩尊。
  • 2.您無法更改元組中的項目類型涛浙;它們始終具有與創(chuàng)建時相同的類型。
  • 3.您可以使用數(shù)字位置或命名它們來訪問元組中的項目对省,但是Swift不會讓您讀取不存在的數(shù)字或名稱蝗拿。

通過將多個項目放在括號中來創(chuàng)建元組,如下所示:

var name = (first: "Taylor", last: "Swift")

然后蒿涎,您可以使用從0開始的數(shù)字位置訪問項目:

name.0

或者哀托,您可以使用其名稱訪問項目:

name.first

請記住,創(chuàng)建元組后可以更改其值劳秋,但不能更改值的類型仓手。因此胖齐,如果您嘗試將其更改namebe (first: "Justin", age: 25),則會出現(xiàn)錯誤嗽冒。

數(shù)組呀伙、集合和元組的用法

數(shù)組,集合和元組乍一看似乎很相似添坊,但是它們有不同的用途剿另。為了幫助您知道要使用哪個,這里有一些規(guī)則贬蛙。

如果您需要一個特定的雨女,固定的相關(guān)值集合,其中每個項目都有一個精確的位置或名稱阳准,則應(yīng)使用一個元組:

let address = (house: 555, street: "Taylor Swift Avenue", city: "Nashville")

如果您需要一個必須唯一的值的集合氛堕,或者需要能夠非常快速地檢查其中是否有特定項目野蝇,則應(yīng)使用一組:

let set = Set(["aardvark", "astronaut", "azalea"])

如果您需要一個可以包含重復(fù)項的值的集合讼稚,或者項目的順序很重要,則應(yīng)使用一個數(shù)組:

let pythons = ["Eric", "Graham", "John", "Michael", "Terry", "Terry"]

到目前為止绕沈,數(shù)組是這三種類型中最常見的锐想。

字典(Dictionary)

字典就像數(shù)組一樣是值的集合,但是您不必使用整數(shù)位置存儲東西乍狐,而是可以使用所需的任何內(nèi)容來訪問它們痛倚。

存儲字典數(shù)據(jù)的最常見方法是使用字符串。例如澜躺,我們可以創(chuàng)建一個字典來存儲歌手的身高,并使用他們的名字:

let heights = [
    "Taylor Swift": 1.78,
    "Ed Sheeran": 1.73
]

就像數(shù)組一樣抒蚜,字典以方括號開頭和結(jié)尾掘鄙,并且每個項目都以逗號分隔。但是嗡髓,我們也使用冒號將要存儲的值(例如1.78)與要存儲在其下的標(biāo)識符(例如“ Taylor Swift”)分開操漠。

這些標(biāo)識符稱為key,您可以使用它們從字典中讀回數(shù)據(jù):

heights["Taylor Swift"]

注意:使用類型注釋時饿这,字典用括號括起來浊伙,在標(biāo)識符和值類型之間用冒號表示。例如[String: Double][String: String]长捧。

如果您嘗試使用不存在的鍵從字典中讀取一個值嚣鄙,Swift將會發(fā)回您nil(完全沒有)。盡管這可能是您想要的串结,但是還有另一種選擇:我們可以為字典提供一個默認(rèn)值哑子,以供我們在需要缺少鍵的情況下使用舅列。

為了演示這一點,讓我們?yōu)閮蓚€人創(chuàng)建一個喜愛的冰淇淋字典:

let favoriteIceCream = [
    "Paul": "Chocolate",
    "Sophie": "Vanilla"
]

我們可以這樣閱讀保羅最喜歡的冰淇淋:

favoriteIceCream["Paul"]

但是卧蜓,如果我們嘗試閱讀夏洛特最喜歡的冰淇淋帐要,則會得到零,這意味著Swift對該鍵沒有任何價值:

favoriteIceCream["Charlotte"]

我們可以通過將字典的默認(rèn)值設(shè)置為“未知”來解決此問題弥奸,以便在未找到夏洛特冰淇淋時榨惠,返回“未知”而不是nil:

favoriteIceCream["Charlotte", default: "Unknown"]

創(chuàng)建空集合

數(shù)組,集合和字典稱為集合盛霎,因為它們將值集中在一起赠橙。

如果要創(chuàng)建一個空集合,只需寫出它的類型摩渺,然后用括號括起來简烤。例如,我們可以創(chuàng)建一個空字典摇幻,其中包含用于鍵和值的字符串横侦,如下所示:

var teams = [String: String]()

然后我們可以稍后添加條目,如下所示:

teams["Paul"] = "Red"

同樣绰姻,您可以創(chuàng)建一個空數(shù)組來存儲整數(shù)枉侧,如下所示:

var results = [Int]()

例外是創(chuàng)建一個空集合,是通過不同的方式完成的:

var words = Set<String>()
var numbers = Set<Int>()

這是因為Swift僅對字典和數(shù)組具有特殊的語法狂芋;其他類型必須使用尖括號語法(例如set)榨馁。

如果需要,可以使用類似的語法創(chuàng)建數(shù)組和字典:

var scores = Dictionary<String, Int>()
var results = Array<Int>()

枚舉(Enumerations)

枚舉是一組相關(guān)的值定義了一個共同的類型帜矾,使你可以在你的代碼中以類型安全的方式來使用這些值翼虫。
例如,如果您想編寫一些代碼來表示正在執(zhí)行的某些工作的成功或失敗屡萤,則可以將其表示為字符串:

let result = "failure"

但是珍剑,如果有人不小心使用了不同的命名會怎樣?

let result2 = "failed"
let result3 = "fail"

這三個都是不同的字符串死陆,所以它們的含義不同招拙。

使用枚舉,我們可以定義一個Result可以為successor 的類型failure措译,如下所示:

enum Result {
    case success
    case failure
}

現(xiàn)在别凤,當(dāng)我們使用它時,我們必須選擇以下兩個值之一:

let result4 = Result.failure

這樣可以防止您每次意外使用不同的字符串领虹。

除了存儲簡單值之外规哪,枚舉還可以存儲附加到每種情況的關(guān)聯(lián)值。這使您可以將附加信息附加到枚舉掠械,以便它們可以代表更多細(xì)微差別的數(shù)據(jù)由缆。

例如注祖,我們可以定義一個存儲各種活動的枚舉:

enum Activity {
    case bored
    case running
    case talking
    case singing
}

這些枚舉值告訴我們說有人在說話,但我們不知道他們在說什么均唉,或者我們可以知道有人正在跑步是晨,但我們不知道他們跑到哪里去。

枚舉關(guān)聯(lián)值使我們可以添加以下其他詳細(xì)信息:

enum Activity {
    case bored
    case running(destination: String)
    case talking(topic: String)
    case singing(volume: Int)
}

現(xiàn)在我們可以更精確了–我們可以說有人在談?wù)撟闱颍?/p>

let talking = Activity.talking(topic: "football")

有時您需要能夠為枚舉賦值舔箭,以便它們具有含義罩缴。這使您可以動態(tài)創(chuàng)建它們,并以不同方式使用它們层扶。

例如箫章,您可以創(chuàng)建一個Planet枚舉,用于存儲每種情況的整數(shù)值:

enum Planet: Int {
    case mercury
    case venus
    case earth
    case mars
}

Swift會自動為每個數(shù)字分配一個從0開始的數(shù)字镜会,您可以使用該數(shù)字創(chuàng)建適當(dāng)?shù)拿杜e大小寫的實例檬寂。例如,earth將被賦予數(shù)字2戳表,因此您可以這樣編寫:

let earth = Planet(rawValue: 2)

如果需要桶至,可以為一個或多個案例指定一個特定的值,Swift會生成其余的案例匾旭。我們認(rèn)為地球是第二個行星并不是很自然镣屹,因此您可以這樣寫:

enum Planet: Int {
    case mercury = 1
    case venus
    case earth
    case mars
}

現(xiàn)在,Swift將分配1到mercury上价涝,并從那里開始向上計數(shù)女蜈,這意味著earth現(xiàn)在是第三顆行星。

總結(jié)

  • 1.數(shù)組色瘩,集合伪窖,元組和字典可讓您在單個值下存儲一組項目。它們各自以不同的方式執(zhí)行此操作居兆,因此您使用哪種方法取決于所需的行為惰许。
  • 2.數(shù)組按添加順序存儲項目,并使用數(shù)字位置訪問它們史辙。
  • 3.集合設(shè)置存儲項目時沒有任何順序,因此您不能使用數(shù)字位置訪問它們佩伤。
  • 4.元組的大小是固定的聊倔,您可以在每個項目中附加名稱。您可以使用數(shù)字位置或名稱來讀取項目生巡。
  • 5.詞典根據(jù)鍵存儲項目耙蔑,您可以使用這些鍵讀取項目。
  • 6.枚舉是對相關(guān)值進(jìn)行分組的一種方式孤荣,因此您可以使用它們而不會出現(xiàn)拼寫錯誤甸陌。
  • 7.您可以將原始值附加到枚舉须揣,以便可以從整數(shù)或字符串創(chuàng)建它們,也可以添加關(guān)聯(lián)的值以存儲有關(guān)每種情況的其他信息钱豁。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耻卡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子牲尺,更是在濱河造成了極大的恐慌卵酪,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谤碳,死亡現(xiàn)場離奇詭異溃卡,居然都是意外死亡,警方通過查閱死者的電腦和手機蜒简,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門瘸羡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搓茬,你說我怎么就攤上這事犹赖。” “怎么了垮兑?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵冷尉,是天一觀的道長。 經(jīng)常有香客問我系枪,道長雀哨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任私爷,我火速辦了婚禮雾棺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衬浑。我一直安慰自己捌浩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布工秩。 她就那樣靜靜地躺著尸饺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪助币。 梳的紋絲不亂的頭發(fā)上浪听,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機與錄音眉菱,去河邊找鬼迹栓。 笑死,一個胖子當(dāng)著我的面吹牛俭缓,可吹牛的內(nèi)容都是我干的克伊。 我是一名探鬼主播酥郭,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼愿吹!你這毒婦竟也來了不从?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洗搂,失蹤者是張志新(化名)和其女友劉穎消返,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耘拇,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡撵颊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了惫叛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倡勇。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖嘉涌,靈堂內(nèi)的尸體忽然破棺而出妻熊,到底是詐尸還是另有隱情,我是刑警寧澤仑最,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布扔役,位于F島的核電站,受9級特大地震影響警医,放射性物質(zhì)發(fā)生泄漏亿胸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一预皇、第九天 我趴在偏房一處隱蔽的房頂上張望侈玄。 院中可真熱鬧,春花似錦吟温、人聲如沸序仙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潘悼。三九已至,卻和暖如春爬橡,著一層夾襖步出監(jiān)牢的瞬間挥等,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工堤尾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人迁客。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓郭宝,卻偏偏與公主長得像辞槐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粘室,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,033評論 2 355

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