集合類型
數(shù)組是有序值的集合。合集是唯一值的無序集合。字典是無序的鍵值對(duì)集合
數(shù)組、合集和字典總是明確能儲(chǔ)存的值的類型以及它們能儲(chǔ)存的鍵。
不可以插入一個(gè)錯(cuò)誤類型的值到集合中,可以從集合當(dāng)中取回確定類型的值
-
創(chuàng)建一個(gè)集合賦值給變量即可變集合,賦值給常量即不可變集合
集合類型
數(shù)組(Array類型橋接到NSArray類)
數(shù)組類型寫法(完整、簡寫寫法※)
//Array<String> 完整寫法
var valueArr :Array<String> = Array<String>()
//[String] 簡寫寫法 *常用
var valueArr1 :[String] = []
數(shù)組初始化
數(shù)組初始化方法
var someValues :[Int] = []
var someInts = [Int]()
var someItems = Array.init(repeating: 123, count: 3)
var arr2 = [String].init(repeating: "345", count: 5)
var threeItems = Array(repeating: "Garen", count: 3)
var threeNumArrs = Array(repeatElement([123,345], count: 3))
var strArr :[String] = ["Garen","Ashe"]
var mutiArr :[Any] = [123,"234",123.345]//Any類型 可以存放多個(gè)類型的值 但不推薦
var addArr = threeItems + strArr //通過+連接符創(chuàng)建
使用數(shù)組字面量創(chuàng)建 可省略變量類型
如果已聲明變量類型,只能與變量聲明類型一致
數(shù)組為[Any],可存放多種數(shù)據(jù)類型
通過+連接符創(chuàng)建 【注意】數(shù)據(jù)類型兼容才可以相加
訪問數(shù)組
- 數(shù)組的count屬性
var strArr :[String] = ["Garen","Ashe"]
print("\(strArr.count)")//數(shù)組的元素?cái)?shù)量
if strArr.isEmpty { //使用Bool類型
print("strArr is empty")
}
- 數(shù)組索引、下標(biāo)
var strArr :[String] = ["Garen","Ashe"]
var firstObject = strArr[1]//通過下標(biāo)取值
print(strArr[strArr.index(after: strArr.startIndex)])
print(strArr[strArr.index(before: strArr.endIndex)])
print(strArr[strArr.index(strArr.count, offsetBy: -1)])
var index: Int? = strArr.firstIndex(of: "Ashe")//可能沒有值 為可選類型
print(strArr[strArr.index(index!, offsetBy: -1)])
- 數(shù)組元素替換
var strArr :[String] = ["Garen","Ashe"]
var firstObject = strArr[0]//通過下標(biāo)取值
strArr[0] = "Ionia"http://直接改變下標(biāo)所在值
print(firstObject)//z索引對(duì)應(yīng)的值改變 不改變firstObject的值
strArr[0..<2] = ["Ashe","Catallina","Parker"]//可以替換范圍長度不同的值的合集 但是前面的范圍不允許越界
- 數(shù)組元素插入
//數(shù)組元素插入
strArr.insert("Nocxus", at: 2)
strArr.insert("Hello", at: strArr.endIndex)
strArr.insert("World", at: strArr.index(after: strArr.startIndex))
strArr.insert(contentsOf: ["Who"], at: strArr.endIndex)
print(strArr)//輸出:["Ashe", "World", "Catallina", "Nocxus", "Parker", "Hello", "Who"]
var index1 :Int? = strArr.firstIndex(of: "World")
var index2 :Int? = strArr.index(before: strArr.endIndex)
if let min = index1, let max = index2 {
let replaceRange = min...max
strArr.replaceSubrange(replaceRange, with: ["Year","Month","Day"])
print(strArr)//輸出:["Ashe", "Year", "Month", "Day"]
}
- 數(shù)組元素刪除
var strArr :[String] = ["Garen","Ashe","Nocxus","Demacia","Hello","Year"]
let deleteFirstItem = strArr.remove(at: 0)//刪除該并返回該元素的值
strArr.removeFirst();//刪除首位元素
let deleteLastItem = strArr.removeLast()//刪除末尾元素
print(deleteFirstItem,deleteLastItem,strArr)//輸出: Garen Year ["Nocxus", "Demacia", "Hello"]
strArr.removeAll()//刪除所有元素
- 數(shù)組元素遍歷
//通過for-in遍歷數(shù)組
for item in strArr {
print(item)
}
for (index,item) in strArr.enumerated() {
print(index,item)
}
集合(Set類型橋接到基礎(chǔ)類NSSet類)
集合的屬性
- 合集將同一類型且不重復(fù)的值無序地儲(chǔ)存在一個(gè)集合當(dāng)中。
- Set類型的哈希值:類型必須提供計(jì)算自身哈希值的方法,哈希值是Int值且所有的對(duì)比起來相等的對(duì)象都相同,比如a==b a.hashValue = b.hashValue
- Swift的所有基礎(chǔ)類型都是可哈希的,并且可以用于集合或者字典的鍵 沒有關(guān)聯(lián)值的枚舉成員值,同樣默認(rèn)可哈希
集合類型語法
Set<Element> 沒有簡寫
集合初始化
- 使用初始化器語法創(chuàng)建確定類型的空集合
var letters = Set<Character>()
letters.insert("a")
letters = []//基于初始化器的類型,被推斷為Set<Character
- 使用數(shù)組字面量創(chuàng)建集合
var letters = Set<Character>()
letters.insert("a")
letters = []//基于初始化器的類型,被推斷為Set<Character
var favoriteHeors :Set<String> = ["Jiawen IV","Paker","Trondel","Trondel"]//String值的集合 重復(fù)元素會(huì)被刪除
//集合類型不能從字面量推斷 所以必須顯示聲明
//但是在使用相同類型的數(shù)組字面量不用寫集合的包含類型
var demaciaHeros :Set = ["Lax","Silas","Shavans","Gallio"]//根據(jù)【類型推斷】,集合類型為<String>
集合的訪問及修改
- 集合count屬性 isEmpty屬性 contains()函數(shù)
if !demaciaHeros.isEmpty {
print("demaciaHeros have \(demaciaHeros.count) items")//輸出:demaciaHeros have 4 items
}
if !demaciaHeros.contains("Vain") {
print("demaciaHeros haven't Vain")//輸出:demaciaHeros haven't Vain
}
- 添加元素
demaciaHeros.insert("Vain")//返回插入是否成功Bool 以及插入值
- 刪除元素
demaciaHeros.removeFirst()//刪除首個(gè)元素
demaciaHeros.remove("Vain")//刪除指定元素
- 刪除元素
for hero in demaciaHeros {
print(hero)//輸出:Silas Shavans Gallio
}
//以特定的順序遍歷 把合集的元素用sorted()方法作為使用(<)運(yùn)算符排序的數(shù)組返回
for hero in demaciaHeros.sorted(by: <) {
print(hero)//輸出:Gallio Shavans Silas
}
集合相關(guān)基本操作
- 兩集合操作產(chǎn)生New合集
- 使用 intersection(_:)方法來創(chuàng)建一個(gè)只包含兩個(gè)合集共有值的新合集
- 使用 symmetricDifference(_:)方法來創(chuàng)建一個(gè)只包含兩個(gè)合集各自有的非共有值的新合集
- 使用 union(_:)方法來創(chuàng)建一個(gè)包含兩個(gè)合集所有值的新合集
- 使用 subtracting(_:)方法來創(chuàng)建一個(gè)兩個(gè)合集當(dāng)中不包含某個(gè)合集值的新合集
陰影部分表示兩個(gè)集合操作結(jié)果
var oneDigist :Set<Int> = [1, 2, 3, 4, 5]
var twoDigist :Set<Int> = [1, 2, 6, 7, 8]
print(oneDigist.union(twoDigist).sorted(by: >))// a U b
print(oneDigist.intersection(twoDigist).sorted(by: >))// a Π b
print(oneDigist.subtracting(twoDigist))
print(oneDigist.symmetricDifference(twoDigist))
- 兩集合成員關(guān)系和相等性
- 使用“相等”運(yùn)算符 (==)來判斷兩個(gè)合集是否包含有相同的值;
- 使用 isSubset(of:)方法來確定一個(gè)合集的所有值是被某合集包含;
- 使用 isSuperset(of:)方法來確定一個(gè)合集是否包含某個(gè)合集的所有值;
- 使用 isStrictSubset(of:)或者isStrictSuperset(of:)方法來確定是個(gè)合集是否為某一個(gè)合集的子集或者超集,但并不相等;
- 使用 isDisjoint(with:)方法來判斷兩個(gè)合集是否擁有完全不同的值。
集合成員關(guān)系和相等性圖解
var oneDigist :Set<Int> = [1, 2, 3, 4, 5]
var twoDigist :Set<Int> = [1, 2, 4, 5, 3]
let threeDigist :Set<Int> = [1, 2, 3]
print(oneDigist == twoDigist)//輸出:false
print(threeDigist.isSubset(of: oneDigist))//輸出:true
print(oneDigist.isSuperset(of: threeDigist))//輸出:true
print(twoDigist.isStrictSubset(of: oneDigist))//輸出:false
print(oneDigist.isStrictSuperset(of: twoDigist))//輸出:false
print(oneDigist.isDisjoint(with: twoDigist))//輸出:false
字典(Dictionary類型橋接到基礎(chǔ)類NSDictionary類)
- 字典儲(chǔ)存無序的互相關(guān)聯(lián)的同一類型的鍵和同一類型的值的集合
字典類型寫法
Dictionary<Key,Value> 簡寫[Key,Value]※
字典初始化
var nameDic :Dictionary <String,String> = [:]
var name2Dic = [String:String]()
//用字典字面量創(chuàng)建字典
var numRomanDic :Dictionary<String,String> = ["1":"one","2":"two"]//完整寫法
var numRoman2Dic :[String:String] = ["1":"one","2":"two"]//簡寫方式 *推薦
//根據(jù)字面量創(chuàng)建 省略聲明類型聲明以及鍵值類型
字典訪問及修改
- count屬性 isEmpty屬性
if !numRomanDic.isEmpty {
print(numRomanDic.count)
}
- 添加、更改key關(guān)聯(lián)的值
numRomanDic["4"] = "four"http://使用下標(biāo)h給字典添加元素
numRomanDic["1"] = "five"http://更改key關(guān)聯(lián)的值
//通過updateValue(<value:>, forKey:)設(shè)置或更改值
numRomanDic.updateValue("six", forKey: "6")//返回nil即為添加
numRomanDic.updateValue("one", forKey: "1")//返回舊值即為修改
與下標(biāo)不同點(diǎn)在于updateValue(<value:>, forKey:)在執(zhí)行更新之后返回舊的值,可允許你檢查更新是否成功,返回的值是一個(gè)字典值類型的可選值 可能為nil(即添加該鍵值)
返回的值是一個(gè)字典值類型的可選值
- 通過鍵取值也是可選類型
//通過可選定綁定類判斷
if let num = numRomanDic["1"] {
print(num)
}
- 刪除鍵值對(duì)(同理也有直接賦值nil 或通過removeValue(forKey:)方法通過返回的可選值來判斷是否成功)
numRomanDic["1"] = nil//使用下標(biāo)腳本語法刪除鍵值對(duì)
if let isDelete = numRomanDic.removeValue(forKey: "2") {
print(isDelete)
}
- 遍歷字典
for (key, value) in numRomanDic {
print(key,value)
}
for key in numRomanDic.keys {
print(key)
}
for value in numRomanDic.values {
print(value)
}
let numRomanKeys = [String](numRomanDic.keys)
let numRomanValues = [String](numRomanDic.values)
Swift學(xué)習(xí)日記4.0



