swift 集合类型(数组、集合、字典)

639 阅读4分钟

这是我参与更文挑战的第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 中,许多基本类型,诸如StringArrayDictionary类型均以结构体的形式实现。这意味着被赋值给新的常量或变量,或者被传入函数或方法中时,它们的值会被拷贝。

OC 中NSString,NSArray和NSDictionary类型均以类的形式实现,而并非结构体。它们在被赋值或者被传入函数或方法时,不会发生值拷贝,而是传递现有实例的引用。