swift-day03-集合

[swift-day03-集合]

  • Swift 語言提供Arrays辰如、Sets和Dictionaries三種基本的集合類型用來存儲集合數(shù)據(jù)。數(shù)組(Arrays)是有序數(shù)據(jù)的集责循。集合(Sets)是無序無重復數(shù)據(jù)的集糟港。字典(Dictionaries)是無序的鍵值對的集攀操。如果創(chuàng)建一個Arrays院仿、Sets或Dictionaries并且把它分配成一個變量,這個集合將會是可變的速和。這意味著我們可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項歹垫,或者改變集合中的數(shù)據(jù)項。如果我們把Arrays颠放、Sets或Dictionaries分配成常量排惨,那么它就是不可變的,它的大小和內(nèi)容都不能被改變碰凶。
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //Swift 語言提供Arrays暮芭、Sets和Dictionaries三種基本的集合類型用來存儲集合數(shù)據(jù)。數(shù)組(Arrays)是有序數(shù)據(jù)的集欲低。集合(Sets)是無序無重復數(shù)據(jù)的集辕宏。字典(Dictionaries)是無序的鍵值對的集。如果創(chuàng)建一個Arrays砾莱、Sets或Dictionaries并且把它分配成一個變量瑞筐,這個集合將會是可變的。這意味著我們可以在創(chuàng)建之后添加更多或移除已存在的數(shù)據(jù)項腊瑟,或者改變集合中的數(shù)據(jù)項聚假。如果我們把Arrays、Sets或Dictionaries分配成常量闰非,那么它就是不可變的膘格,它的大小和內(nèi)容都不能被改變。
        //------------數(shù)組---------------
        //寫 Swift 數(shù)組應該遵循像Array<Element>這樣的形式财松,其中Element是這個數(shù)組中唯一允許存在的數(shù)據(jù)類型闯袒。我們也可以使用像[Element]這樣的簡單語法
        //創(chuàng)建一個空的數(shù)組,構(gòu)造語法來創(chuàng)建一個由特定數(shù)據(jù)類型構(gòu)成的空數(shù)組
        var emptyArry = [Int]();//通過構(gòu)造函數(shù)的類型,someInts的值類型被推斷為[Int]
        //一個函數(shù)參數(shù)或者一個已經(jīng)定義好類型的常量或者變量政敢,我們可以使用空數(shù)組語句創(chuàng)建一個空數(shù)組其徙,它的寫法很簡單:[]
        emptyArry.append(3)//現(xiàn)在包涵一個Int值
        emptyArry = [];//emotyArray 現(xiàn)在是空數(shù)組 ,但依舊是[Int]類型的
        //Swift 中的Array類型還提供一個可以創(chuàng)建特定大小并且所有數(shù)據(jù)都被默認的構(gòu)造方法喷户。我們可以把準備加入新數(shù)組的數(shù)據(jù)項數(shù)量(count)和適當類型的初始值(repeatedValue)傳入數(shù)組構(gòu)造函數(shù)
        var createDouble = [Double](count: 3, repeatedValue: 1.0);//等價于 [1.0唾那,1.0,1.0]
        //使用加法操作符(+)來組合兩種已存在的相同類型數(shù)組褪尝。新數(shù)組的數(shù)據(jù)類型會被從兩個數(shù)組的數(shù)據(jù)類型中推斷出來
        var anthonerDouble = Array(count: 3, repeatedValue: 2.0);// anthonerDouble 被推斷為 [Double]闹获,等價于 [2.0, 2.0, 2.0]
      
        var twoDouble = createDouble + anthonerDouble;//twoDouble 被推斷為 [Double],等價于 [1.0, 1.0, 1.0, 2.0, 2.0, 2.0]
        print(twoDouble)
        //我們可以使用字面量來進行數(shù)組構(gòu)造河哑,這是一種用一個或者多個數(shù)值構(gòu)造數(shù)組的簡單方法避诽。字面量是一系列由逗號分割并由方括號包含的數(shù)值:[value 1, value 2, value 3]
        
        var exampleArray:[String] = ["peng","lei"];//量被聲明為“字符串值類型的數(shù)組“,記作[String]璃谨。 因為這個數(shù)組被規(guī)定只有String一種數(shù)據(jù)結(jié)構(gòu)沙庐,所以只有String類型可以在其中被存取。 在這里佳吞,exampleArrayt數(shù)組由兩個String值("peng" 和"lei")構(gòu)造拱雏,并且由字面量定義
        //字面量僅僅包含兩個String值。匹配了該數(shù)組的變量聲明(只能包含String的數(shù)組)底扳,所以這個字面量的分配過程可以作為用兩個初始項來構(gòu)造shoppinglist的一種方式铸抑。由于 Swift 的類型推斷機制,當我們用字面量構(gòu)造只擁有相同類型值數(shù)組的時候衷模,我們不必把數(shù)組的類型定義清楚鹊汛。 exampleArray的構(gòu)造也可以這樣寫:var exampleArray = ["peng","lei"];
        //使用數(shù)組的只讀屬性count來獲取數(shù)組中的數(shù)據(jù)項數(shù)量
        print(exampleArray.count)
        //使用布爾值屬性isEmpty作為檢查count屬性的值是否為 0 
        if exampleArray.isEmpty{
            print("The exampleArray list is empty.")
        }
        //使用append(_:)方法在數(shù)組后面添加新的數(shù)據(jù)項:
        exampleArray.append("I Love you")
        print(exampleArray)//輸出結(jié)果["peng", "lei", "I Love you"]
        //使用加法賦值運算符(+=)也可以直接在數(shù)組后面添加一個或多個擁有相同類型的數(shù)據(jù)項
        exampleArray += ["peng"];
        print(exampleArray)//輸出結(jié)果["peng", "lei", "I Love you", "peng"]
        //直接使用下標語法來獲取數(shù)組中的數(shù)據(jù)項,把我們需要的數(shù)據(jù)項的索引值放在直接放在數(shù)組名稱的方括號中
        var firstItem = exampleArray[0];
        //用下標來改變某個已有索引值對應的數(shù)據(jù)值
        exampleArray[0] = "haha";//現(xiàn)在其第一項變?yōu)榱薶aha
        //可以利用下標來一次改變一系列數(shù)據(jù)值阱冶,即使新數(shù)據(jù)和原有數(shù)據(jù)的數(shù)量是不一樣的
        exampleArray[1...3] = ["p","l"];
        print(exampleArray)//輸出結(jié)果["haha", "p", "l"]
        //調(diào)用數(shù)組的insert(_:atIndex:)方法來在某個具體索引值之前添加數(shù)據(jù)項
        exampleArray .insert("peng", atIndex: 0)
        print(exampleArray)//["peng", "haha", "p", "l"]
        //使用removeAtIndex(_:)方法來移除數(shù)組中的某一項刁憋。這個方法把數(shù)組在特定索引值中存儲的數(shù)據(jù)項移除并且返回這個被移除的數(shù)據(jù)項(我們不需要的時候就可以無視它)
        let indexRemove = exampleArray.removeAtIndex(0)
        print(exampleArray,indexRemove)//["haha", "p", "l"] peng
        //數(shù)組遍歷
        //使用for-in循環(huán)來遍歷所有數(shù)組中的數(shù)據(jù)項
        for item in exampleArray{
           print(item)
        }
        //同時需要每個數(shù)據(jù)項的值和索引值,可以使用enumerate()方法來進行數(shù)組遍歷熙揍。enumerate()返回一個由每一個數(shù)據(jù)項索引值和數(shù)據(jù)值組成的元組职祷。我們可以把這個元組分解成臨時常量或者變量來進行遍歷:
        for (index,value) in exampleArray.enumerate(){
         
             print("Item \(index+1):\(value)")
        
        }
        
        
        //-----------------------------集合---------------------------
        //集合(Set)用來存儲相同類型并且沒有確定順序的值。當集合元素順序不重要時或者希望確保每個元素只出現(xiàn)一次時可以使用集合而不是數(shù)組届囚。
        //Swift 中的Set類型被寫為Set<Element>有梆,這里的Element表示Set中允許存儲的類型,和數(shù)組不同的是意系,集合沒有等價的簡化形式
        //通過構(gòu)造器語法創(chuàng)建一個特定類型的空集合
        var letter = Set<Character>()
        //如果上下文提供了類型信息泥耀,比如作為函數(shù)的參數(shù)或者已知類型的變量或常量,我們可以通過一個空的數(shù)組字面量創(chuàng)建一個空的Set
        letter.insert("a")//現(xiàn)在包含一個元素
        letter = [] //letter 現(xiàn)在是空的蛔添, 但是它依然是 Set<Character> 類型
        //使用數(shù)組字面量來構(gòu)造集合痰催,并且可以使用簡化形式寫一個或者多個值作為集合元素
        var set1:Set<String> = ["one","two","three"];//變量被聲明為“一個String值的集合”兜辞,寫為Set<String>。由于這個特定的集合含有指定String類型的值夸溶,所以它只允許存儲String類型值,有三個String類型的初始值("one"逸吵,"two"和"three"),并以數(shù)組字面量的方式出現(xiàn)
         //由于 Swift 的類型推斷功能缝裁,如果你想使用一個數(shù)組字面量構(gòu)造一個Set并且該數(shù)組字面量中的所有元素類型相同扫皱,那么你無須寫出Set的具體類型。favoriteGenres的構(gòu)造形式可以采用簡化的方式代替
        var set2 :Set = ["one","two","three"];
        //和數(shù)組一樣捷绑,找出一個Set中元素的數(shù)量韩脑,可以使用其只讀屬性count
        print(set1.count)
        //使用布爾屬性isEmpty作為一個縮寫形式去檢查count屬性是否為0
        if set1.isEmpty{
          print("hh")
        }
        //調(diào)用Set的insert(_:)方法來添加一個新元素
        set1.insert("four")
        //通過調(diào)用Set的remove(_:)方法去刪除一個元素,如果該值是該Set的一個元素則刪除該元素并且返回被刪除的元素值粹污,否則如果該Set不包含該值段多,則返回nil。另外壮吩,Set中的所有元素可以通過它的removeAll()方法刪除
        let removeSet = set1.remove("four");
        //for-in循環(huán)中遍歷一個Set中的所有值进苍。
        for item in set1{
         
            print(item)
        
 }
        //Swift 的Set類型沒有確定的順序,為了按照特定順序來遍歷一個Set中的值可以使用sort()方法粥航,它將根據(jù)提供的序列返回一個有序集合.
        for item in set1.sort(){
            print("\(item)");
        }
        //集合的之間的幾種操作
//        使用intersect(_:)方法根據(jù)兩個集合中都包含的值創(chuàng)建的一個新的集合琅捏。
//        使用exclusiveOr(_:)方法根據(jù)在一個集合中但不在兩個集合中的值創(chuàng)建一個新的集合生百。
//        使用union(_:)方法根據(jù)兩個集合的值創(chuàng)建一個新的集合递雀。
//        使用subtract(_:)方法根據(jù)不在該集合中的值創(chuàng)建一個新的集合
        
        let oneSet: Set = [0,1,2];
        let twoSet: Set = [2,3,4,5,6];
        let threeSet:Set = [5,6,7,8,9];
        print(oneSet.union(twoSet).sort())//輸出[0, 1, 2, 3, 4, 5, 6]
        print(oneSet.intersect(twoSet).sort())//輸出[2]
        print(twoSet .subtract(threeSet).sort())//輸出[2, 3, 4]
        print(twoSet.exclusiveOr(threeSet).sort())//輸出[2, 3, 4, 7, 8, 9]
        //包含關(guān)系
//        使用“是否相等”運算符(==)來判斷兩個集合是否包含全部相同的值。
//        使用isSubsetOf(_:)方法來判斷一個集合中的值是否也被包含在另外一個集合中蚀浆。
//        使用isSupersetOf(_:)方法來判斷一個集合中包含另一個集合中所有的值缀程。
//        使用isStrictSubsetOf(_:)或者isStrictSupersetOf(_:)方法來判斷一個集合是否是另外一個集合的子集合或者父集合并且兩個集合并不相等。
//        使用isDisjointWith(_:)方法來判斷兩個集合是否不含有相同的值(是否沒有交集)市俊。
        let fourSet : Set = [0,1,2,3,4,5,6,7,8,9];
        print(oneSet == twoSet)//false
        print(oneSet.isSubsetOf(fourSet))//true
        print(oneSet.isSupersetOf(oneSet))//true
        print(oneSet.isStrictSubsetOf(fourSet))//true
        print(oneSet.isDisjointWith(fourSet))//false
        
        //------------------------字典--------------
        //Swift 的字典使用Dictionary<Key, Value>定義杨凑,其中Key是字典中鍵的數(shù)據(jù)類型,Value是字典中對應于這些鍵所存儲值的數(shù)據(jù)類型,也可以用[Key: Value]這樣快捷的形式去創(chuàng)建一個字典類型摆昧。雖然這兩種形式功能上相同撩满,但是后者是首選
        //可以像數(shù)組一樣使用構(gòu)造語法創(chuàng)建一個擁有確定類型的空字典:
        var dict1 = [Int:String]()//一個空的 [Int: String] 字典
        //如果上下文已經(jīng)提供了類型信息,我們可以使用空字典字面量來創(chuàng)建一個空字典绅你,記作[:](中括號中放一個冒號):
        dict1[16] = "peng";//現(xiàn)在包含一個鍵值對
        dict1 = [:];//dict 又成為了一個 [Int: String] 類型的空字典
        //可以使用字典字面量來構(gòu)造字典伺帘,這和我們剛才介紹過的數(shù)組字面量擁有相似語法。字典字面量是一種將一個或多個鍵值對寫作Dictionary集合的快捷途徑忌锯。
        //格式[key 1: value 1, key 2: value 2, key 3: value 3]
        var stringDic:[String:String] = ["one":"1","two":"2"];//字典語句包含了兩個String: String類型的鍵值對
        //和數(shù)組一樣伪嫁,我們在用字典字面量構(gòu)造字典時,如果它的鍵和值都有各自一致的類型偶垮,那么就不必寫出字典的類型,stringDic= ["one":"1","two":"2"],因為這個語句中所有的鍵和值都各自擁有相同的數(shù)據(jù)類型张咳,Swift 可以推斷出Dictionary<String, String>是airports字典的正確類型帝洪。
        //和上面兩個數(shù)據(jù)類型一樣,可以通過字典的只讀屬性count來獲取某個字典的數(shù)據(jù)項數(shù)量脚猾,使用布爾屬性isEmpty來快捷地檢查字典的count屬性是否等于0,這里不再舉例
        //可以在字典中使用下標語法來添加新的數(shù)據(jù)項葱峡。可以使用一個恰當類型的鍵作為下標索引龙助,并且分配恰當類型的新值
        stringDic["three"] = "3";//此時增加了一個數(shù)據(jù)項
        //也可以使用下標語法來改變特定鍵對應的值
        stringDic["three"] = "san";//此時“three”對應的值改為了san
        //作為另一種下標方法族沃,字典的updateValue(_:forKey:)方法可以設(shè)置或者更新特定鍵對應的值。就像上面所示的下標示例泌参,updateValue(_:forKey:)方法在這個鍵不存在對應值的時候會設(shè)置新值或者在存在時更新已存在的值脆淹。和上面的下標方法不同的,updateValue(_:forKey:)這個方法返回更新值之前的原值沽一。這樣使得我們可以檢查更新是否成功盖溺。
        
        //updateValue(_:forKey:)方法會返回對應值的類型的可選值。舉例來說:對于存儲String值的字典铣缠,這個函數(shù)會返回一個String?或者“可選 String”類型的值烘嘱。
        
        //如果有值存在于更新前,則這個可選值包含了舊值蝗蛙,否則它將會是nil
        if let oldValue = stringDic.updateValue("3", forKey: "three"){
        
           print("the old value for was \(oldValue)")
        }
        
        //還可以使用下標語法來通過給某個鍵的對應值賦值為nil來從字典里移除一個鍵值對
        stringDic["four"] = "4";
        stringDic["four"] = nil;//“four”對應的鍵值對被移除了
        //removeValueForKey(_:)方法也可以用來在字典中移除鍵值對蝇庭。這個方法在鍵值對存在的情況下會移除該鍵值對并且返回被移除的值或者在沒有值的情況下返回nil
        if let removedValue = stringDic.removeValueForKey("three"){
        
            print("The  removed name is \(removedValue)");//The  removed name is 3
        }
        //for-in循環(huán)來遍歷某個字典中的鍵值對。每一個字典中的數(shù)據(jù)項都以(key, value)元組形式返回捡硅,并且我們可以使用臨時常量或者變量來分解這些元組
        for(strCode,stringName) in stringDic{
        
            print("\(strCode):\(stringName)")//one:1  two:2
        }
        //通過訪問keys或者values屬性哮内,我們也可以遍歷字典的鍵或者值
        for strcode in stringDic.keys{
          
            print("strcode = \(strcode)")//strcode = one  strcode = two
        }
        for stringName in stringDic.values{
         
            print("stringName = \(stringName)")//  stringName = 1  stringName = 2

        
        }
        //Swift 的字典類型是無序集合類型。為了以特定的順序遍歷字典的鍵或值壮韭,可以對字典的keys或values屬性使用sort()方法
        var stringDic2:[String:String] = ["one":"1","two":"2","three":"3","four":"4","five":"5","six":"6","seven":"7","eight":"8","1":"1","2":"2","3":"3"];
        print(stringDic2.values.sort())//["1", "1", "2", "2", "3", "3", "4", "5", "6", "7", "8"],可見輸出結(jié)果按升序出來的
        
        
        // Do any additional setup after loading the view, typically from a nib.
    }
   
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末北发,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷屋,更是在濱河造成了極大的恐慌琳拨,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯曹,死亡現(xiàn)場離奇詭異狱庇,居然都是意外死亡,警方通過查閱死者的電腦和手機恶耽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門密任,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驳棱,你說我怎么就攤上這事批什。” “怎么了社搅?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵驻债,是天一觀的道長乳规。 經(jīng)常有香客問我,道長合呐,這世上最難降的妖魔是什么暮的? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮淌实,結(jié)果婚禮上冻辩,老公的妹妹穿的比我還像新娘。我一直安慰自己拆祈,他們只是感情好恨闪,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著放坏,像睡著了一般咙咽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上淤年,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天钧敞,我揣著相機與錄音,去河邊找鬼麸粮。 笑死溉苛,一個胖子當著我的面吹牛蛉谜,可吹牛的內(nèi)容都是我干的贿堰。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼贱田,長吁一口氣:“原來是場噩夢啊……” “哼威根!你這毒婦竟也來了凤巨?” 一聲冷哼從身側(cè)響起视乐,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤洛搀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佑淀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留美,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年伸刃,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎砾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡捧颅,死狀恐怖景图,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碉哑,我是刑警寧澤挚币,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布亮蒋,位于F島的核電站,受9級特大地震影響妆毕,放射性物質(zhì)發(fā)生泄漏慎玖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一笛粘、第九天 我趴在偏房一處隱蔽的房頂上張望趁怔。 院中可真熱鬧,春花似錦薪前、人聲如沸润努。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽任连。三九已至,卻和暖如春例诀,著一層夾襖步出監(jiān)牢的瞬間随抠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工繁涂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拱她,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓扔罪,卻偏偏與公主長得像秉沼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矿酵,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

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