[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.
}
}