这是我参与更文挑战的第4天,活动详情查看: 更文挑战
Swift 提供了三种主要的集合类型,称为数组、集合和字典,用于存储值的集合。
数组是有序的值集合
集合是唯一值的无序集合
字典是键值关联的无序集合
数组
数组初始化
//创建一个空数组
let arr = [Int]()
//创建具有默认值的数组,且所有值都相同
let arr1 = Array(repeating: 2, count: 3) //[2, 2, 2]
//用数组字面量构造数组
let arr2: [String] = ["a","b"]
var arr3 = ["a","b"]
数组是否为空
if arr.isEmpty {
print("空空如也")
}
数组元素个数
let count = arr.count;
数组索引
let arr = ["a","b","c","d"]
var value = arr[2] //c
数组添加新元素
- 尾部添加(
append)
var arr = [1,2,3,4]
arr.append(5)
print(arr) //[1, 2, 3, 4, 5]
- 指定索引添加
var arr: [String] = ["a","b","c","d"]
arr.insert("W", at: 2)
print(arr) //["a", "b", "W", "c", "d"]
- 俩个数组拼合
var arr = ["a","b","c"]
var arr1 = ["A","B","C"]
let allArr = arr + arr1
print(allArr) //["a", "b", "c", "A", "B", "C"]
数组元素修改
- 修改数组中单个元素
var arr: [String] = ["a","b","c","d"]
arr[2] = "W"
print(arr) //["a", "b", "W", "d"]
- 修改数组中某个范围的元素
var arr: [String] = ["a","b","c","d","e","f","g"]
arr[2...5] = ["X","Y","Z"]
print(arr) //["a", "b", "X", "Y", "Z", "g"]
数组元素删除
var arr: [String] = ["a","b","c","d","e","f","g"]
arr.remove(at: 2)
print(arr) // ["a", "b", "d", "e", "f", "g"]
arr.removeLast()
print(arr) // ["a", "b", "d", "e", "f"]
arr.removeAll() //[]
数组遍历
var arr: [String] = ["a","b","c"]
for item in arr {
print(item)
}
//a
//b
//c
for (index ,value) in arr.enumerated() {
print("\(index)---\(value)")
}
//0---a
//1---b
//2---c
集合
集合初始化
//创建一个空集合
var set = Set<String>()
//用数组字面量构造
var set :Set<String> = ["a","b","c"]
var set :Set = ["a","b","c"]
数组是否为空
if set.isEmpty {
print("空空如也")
}
集合元素个数
let count = set.count;
集合索引
let set = ["a","b","c","d"]
var value = set[2] //c
集合添加新元素
var set :Set<String> = ["a","b","c"]
set.insert("W")
print(set) //["b", "c", "a", "W"]
集合元素删除
var set :Set<String> = ["a","b","c"]
set.remove("b")
print(set) //["c", "a"]
set.removeAll() //[]
集合其他操作
let setA :Set<String> = ["a","b","c"]
let setB :Set<String> = ["a","b","c","d","e"]
- 交集(
intersection)
print(setA.intersection(setB)) //["c", "a", "b"]
- 并集(
union)
print(setA.union(setB)) //["b", "e", "d", "a", "c"]
- 去除交集(
symmetricDifference)
print(setA.symmetricDifference(setB)) //["d", "e"]
- 一个值不在指定集中,会创建一个新的集合
print(setB.subtracting(setA)) //["d", "e"]
- 判断一个集合的所有值是否都包含在指定的集合中
print(setA.isSubset(of: setB)) //true
- 判断一个集合是否包含指定集合中的所有值
print(setA.isSuperset(of: setB)) //false
- 判断一个集合是子集还是超集,但不等于指定的集合
print(setA.isStrictSubset(of: setB)) //true
- 判断两个集合是否没有共同的值
print(setA.isStrictSubset(of: setB)) //false
集合遍历
for value in set {
print(value)
}
//a
//c
//b
//集合先排序在遍历
for value in set.sorted() {
print("\(value)")
}
//a
//c
//b
字典
字典初始化
//构造语法
var dic = [Int: String]()
//创建具有默认值的字典
var dic : [String:String] = ["key":"value"]
var dic = ["key":"value"]
字典是否为空
if dic.isEmpty {
print("空空如也")
}
字典键值对个数
let count = dic.count;
字典添加键值对
var dic = ["keyA":"a","keyB":"b"]
dic["keyC"] = "c"
//["keyC": "c", "keyA": "a", "keyB": "b"]
字典修改元素
- 使用下标语法来改变特定键对应的值
var dic = ["keyA":"a","keyB":"b"]
dic["keyA"] = "W"
print(dic) //["keyB": "b", "keyA": "W"]
- 如果有对应的key,那么会直接更新对应的value,且返回旧值
var dic = ["keyA":"a","keyB":"b"]
let oldValue = dic.updateValue("W", forKey: "keyA")
print(dic) //["keyA": "W", "keyB": "b"]
print(oldValue) //Optional("a")
- 如果没有对应的key,那么会直接添加元素,返回nil
var dic = ["keyA":"a","keyB":"b"]
let oldValue = dic.updateValue("W", forKey: "keyC")
print(dic) //["keyC": "W", "keyA": "a", "keyB": "b"]
print(oldValue) //nil
字典删除
var dic = ["keyA":"a","keyB":"b"]
dic["keyA"] = nil
print(dic) //["keyB": "b"]
dic.removeValue(forKey: "keyB")
print(dic) //[:]
字典遍历
var dic = ["keyA":"a","keyB":"b"]
for (key,value) in dic {
print("\(key)---\(value)")
}
//keyB---b
//keyA---a
for key in dic.keys {
print("\(key)")
}
//keyB
//keyA
for value in dic.values {
print("\(value)")
}
//b
//a
字符串、数组、和字典类型的赋值与复制行为
Swift 中,许多基本类型,诸如String,Array和Dictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。
OC 中NSString,NSArray和NSDictionary类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。