Swift學(xué)習(xí)(三:集合類型)

Swift 語言提供ArraysSetsDictionaries三種基本的集合類型用來存儲(chǔ)集合數(shù)據(jù)生蚁。數(shù)組Arrays是有序數(shù)據(jù)的集。集合Sets是無序無重復(fù)數(shù)據(jù)的集。字典Dictionaries是無序的鍵值對(duì)的集编饺。

Swift 語言中的ArraysSetsDictionaries中存儲(chǔ)的數(shù)據(jù)值類型必須明確响驴。

1.數(shù)組

寫法格式1:Array<Element>
寫法格式2:[Element]

  • 創(chuàng)建一個(gè)空數(shù)組

      var arr = [Int]()
      如果代碼上下文提供了類型透且,可以使用空數(shù)組語句創(chuàng)建一個(gè)空數(shù)組
      arr.append(3)    //包含一個(gè)Int值
      arr = []              //顯示是[Int]類型的空數(shù)組
    
  • 創(chuàng)建一個(gè)帶有默認(rèn)值的數(shù)組

      var array = [Double](count:3, repeatedValue:0.0)    //array 是 [Double]類型的數(shù)組,等價(jià)于[0.0, 0.0, 0.0]
    
  • 兩個(gè)數(shù)組相加創(chuàng)建數(shù)組

      var arr + array
    
  • 用字面量構(gòu)造數(shù)組

      var array2:[String] = ["aa","bb"]
    

注意:如果創(chuàng)建的是常量,則不可修改

  • 訪問和修改數(shù)組

      *用數(shù)組的只讀屬性`count`來獲取數(shù)組的數(shù)量:
        array.count
      *用布爾值`isEmpty`作為檢查`count`屬性的值是否為0
        array.isEmpty
      *使用`append(:_)`方法在數(shù)組后面添加新的數(shù)據(jù)
        array.append("cc")
      *賦值運(yùn)算符`+=`也可以直接在數(shù)組后面添加數(shù)據(jù)
        array += ["dd","ee"]
      *使用下標(biāo)來獲取數(shù)組中的數(shù)據(jù)
        array[0]
      *用下標(biāo)來修改某個(gè)已有索引值對(duì)應(yīng)的數(shù)據(jù)值
         array[1] = "ff"
      *可以用下標(biāo)改變一系列值
        array[2...3] = ["gg","hh"]
      *加數(shù)據(jù)到某個(gè)索引
        array.insert("qq",atIndex:0)
      *可以使用下標(biāo)來移除某個(gè)值
        array.removeAtIndex(3)
      *移除數(shù)組的最后一項(xiàng)
        array.removeLast()
    

注意:當(dāng)增加或者刪除非最后一行的值時(shí)秽誊,后續(xù)數(shù)據(jù)會(huì)自動(dòng)前移鲸沮。

  • 數(shù)組遍歷

      for item in array{
              print(item)
      }
    

如果我們同時(shí)需要數(shù)據(jù)的值和索引值,可以使用enumerate()方法來進(jìn)行數(shù)組遍歷锅论。

    for (index,value) in array.enumerate(){
            print("item:\(String(index+1): \(value))")
    }
2.集合

一個(gè)類型為了存儲(chǔ)在集合中讼溺,該類型必須是可哈希化的--也就是說最易,該類型必須提供一個(gè)方法來計(jì)算它的哈希值怒坯。一個(gè)哈希值是Int類型的,相等的對(duì)象哈希值必須相同藻懒,比如a==b,因此必須a.hashValue == b.hashValue剔猿。

Swift 的所有基本類型(比如String,Int,DoubleBool)默認(rèn)都是可哈希化的嬉荆,可以作為集合的值的類型或者字典的鍵的類型归敬。沒有關(guān)聯(lián)值的枚舉成員值(在枚舉有講述)默認(rèn)也是可哈希化的鄙早。

注意:
你可以使用你自定義的類型作為集合的值的類型或者是字典的鍵的類型弄慰,但你需要使你的自定義類型符合 Swift 標(biāo)準(zhǔn)庫(kù)中的Hashable協(xié)議。符合Hashable協(xié)議的類型需要提供一個(gè)類型為Int的可讀屬性hashValue蝶锋。由類型的hashValue屬性返回的值不需要在同一程序的不同執(zhí)行周期或者不同程序之間保持相同陆爽。
因?yàn)镠ashable協(xié)議符合Equatable協(xié)議,所以符合該協(xié)議的類型也必須提供一個(gè)"是否相等"運(yùn)算符(==)的實(shí)現(xiàn)扳缕。這個(gè)Equatable協(xié)議要求任何符合==實(shí)現(xiàn)的實(shí)例間都是一種相等的關(guān)系慌闭。也就是說,對(duì)于a,b,c三個(gè)值來說躯舔,==的實(shí)現(xiàn)必須滿足下面三種情況:
a == a(自反性)
a == b意味著b == a(對(duì)稱性)
a == b && b == c意味著a == c(傳遞性)

  • 集合類型的語法

      var letter = Set<Character>()
      如果代碼上下文提供了類型驴剔,可以使用空數(shù)組字面量創(chuàng)建一個(gè)空`Set`
      letter.insert("a")      //包含一個(gè)Character值
      letter = []              //顯示是[Character]類型的空數(shù)組
    
  • 數(shù)組字面量創(chuàng)建集合

      var letter1:Set<String> = ["aa","bb","cc","dd"]
    
  • 訪問和修改一個(gè)集合

      *使用只讀屬性:
        letter.count
      *使用布爾屬性檢查`count`屬性是否為0
        letter.inEmpty
      *使用`insert()`方法添加一個(gè)新元素
        letter.insert("hh")
      *用`remove()`方法刪除一個(gè)元素
        letter.remove("aa")
      *刪除所有元素
        letter.removeAll()
      *檢查是否包含特定值
        letter.contains("ss")
    
  • 遍歷一個(gè)集合

      for genre in letter{
              print("\(henre)")
      }
    
  • 集合操作

集合操作
3.字典

字典是一種存儲(chǔ)多個(gè)相同類型的值的容器。每個(gè)值(value)都關(guān)聯(lián)唯一的鍵(key)粥庄,鍵作為字典中的這個(gè)值數(shù)據(jù)的標(biāo)識(shí)符丧失。

  • 創(chuàng)建空字典

      var dic = [Int:String]()
      如果上下文已經(jīng)提供了類型信息,我們可以使用空字典字面量來創(chuàng)建一個(gè)空字典惜互,記作[:](中括號(hào)中放一個(gè)冒號(hào)):
      dic[16] = "ss"
      dic = [:]
    
  • 用字典字面量創(chuàng)建字典
    [key1 : value1, key2 : value2, key3 : value3]

    var dic : [String : String] = ["aa":"AA", "bb":"BB", "cc":"CC"]
    
  • 訪問和修改字典
    *通過制度屬性count來獲取數(shù)量
    dic.count
    *使用布爾屬性isEmpty來檢查count屬性是否等于0
    if dic.isEmpty {
    print("是空的")
    }

      *使用下標(biāo)語法來添加新的數(shù)據(jù)
        dic["dd"] = "DD"
      *使用下標(biāo)來修改值
        dic["cc"] = "qq"
      *使用`updateValue(_:forKey:)`方法可以設(shè)置特定鍵對(duì)應(yīng)的值布讹,和上面的下標(biāo)方法不同的,updateValue(_:forKey:)這個(gè)方法返回更新值之前的原值训堆。這樣使得我們可以檢查更新是否成功描验。
         let oldValue = dic.updateValue("ww",forKey:"aa")
         print (oldValue)     // optional(AA)
    

注意:updateValue(_:forKey:)方法會(huì)返回對(duì)應(yīng)值的類型的可選值。舉例來說:對(duì)于存儲(chǔ)String值的字典坑鱼,這個(gè)函數(shù)會(huì)返回一個(gè)String?或者“可選 String”類型的值膘流。

    *使用下標(biāo)來檢索特定鍵對(duì)應(yīng)的值,因?yàn)橛锌赡苷?qǐng)求的鍵沒有值存在,所以返回的值時(shí)可選值
      let value = dic["aa"]
       print (value)     // optional(AA)

    *通過給某個(gè)值賦值為`nil`來從字典里移除一個(gè)鍵值對(duì)
      dic["bb"] = nil
    *也可以通過`removeValueForKey(_:)`方法移除鍵值對(duì)
  • 字典遍歷

      for (key,value) in dic{
              print("\(key):\(value)")
      }                        //(key,value)可以隨便取名
    
  • 單獨(dú)遍歷keys或者values

     *遍歷keys
     for key in dic.keys{
             print(key)
     }
    
     *遍歷values
      for value in dic.keys{
             print(value)
     }
    
  • 如果需要鍵或者值的集合來作為接受某個(gè)Array的參數(shù)呼股,可以直接食用key或者value構(gòu)造一個(gè)新數(shù)組

      let keyArr = [String](dic.keys)
      let valueARR = [String](dic.values)
    
  • Swift 的字典類型是無序集合類型耕魄。為了以特定的順序遍歷字典的鍵或值,可以對(duì)字典的keysvalues屬性使用sort()方法彭谁。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吸奴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子马靠,更是在濱河造成了極大的恐慌奄抽,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甩鳄,死亡現(xiàn)場(chǎng)離奇詭異逞度,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)妙啃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門档泽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人揖赴,你說我怎么就攤上這事馆匿。” “怎么了燥滑?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵渐北,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我铭拧,道長(zhǎng)赃蛛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任搀菩,我火速辦了婚禮呕臂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肪跋。我一直安慰自己歧蒋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布州既。 她就那樣靜靜地躺著谜洽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪易桃。 梳的紋絲不亂的頭發(fā)上褥琐,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音晤郑,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛造寝,可吹牛的內(nèi)容都是我干的磕洪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诫龙,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼析显!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起签赃,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤谷异,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后锦聊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歹嘹,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谍肤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了你稚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仿荆。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怎抛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芽淡,我是刑警寧澤马绝,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站挣菲,受9級(jí)特大地震影響富稻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜己单,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一唉窃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纹笼,春花似錦纹份、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至笋额,卻和暖如春元暴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兄猩。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工茉盏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鉴未,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓鸠姨,卻偏偏與公主長(zhǎng)得像铜秆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讶迁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 53.計(jì)算字符 在字符串中獲取字符值的數(shù)量, 可以使用字符串字符屬性中的計(jì)數(shù)屬性: let unusualMena...
    無灃閱讀 1,091評(píng)論 0 4
  • 1 .數(shù)組 Arrays 數(shù)組使用有序列表存儲(chǔ)同一類型的多個(gè)值连茧。相同的值可以多次出現(xiàn)在一個(gè)數(shù)組的不同位置中。這和O...
    iceMaple閱讀 465評(píng)論 0 1
  • 前言 3月27號(hào)蘋果發(fā)布了Swift3.1巍糯,官方教程也更新到了3.1啸驯,查看更新記錄發(fā)現(xiàn)更新的內(nèi)容對(duì)之前的文章并沒有...
    BoomLee閱讀 3,138評(píng)論 0 4
  • 由蘋果官網(wǎng)翻譯得來fork自https://github.com/letsswift/The-Swift-Prog...
    佛祖拿屠刀閱讀 424評(píng)論 0 1
  • 李家祺閱讀 469評(píng)論 0 50