swift-集合

Swift提供了三种主要的集合类型,称为数组、集合和字典,用于存储值的集合。 数组是有序的值集合。 集合是唯一值的无序集合。 字典是键值关联的无序集合。Swift 的数组、集合和字典类型被实现为泛型集合。如果创建数组、集合或字典,并将其分配给变量,则创建的集合将是可变的。 这意味着您可以在集合创建后通过添加、删除或更改集合中的项目来更改(或变异)集合。 如果将数组、集合或字典分配给常量,则该集合是不可变的,并且其大小和内容无法更改。

在不需要更改集合的所有情况下创建不可变集合是一种很好的做法。 这样做可以让您更轻松地对代码进行推理,并使 Swift 编译器能够优化您创建的集合的性能。

数组

存储相同类型的值的集合,有序可重复。Swift的Array类型桥接到Object-C的NSArray类。
数组创建全写为Array<类型a>,用于存储类型a相关的元素的集合,我们也可以简写成 [类型a]。

  1. 构建数组
/// 构建一个空数组
var emptyArray:[Int] = []
/// 数组添加元素
emptyArray.append(3)
/// 数组重新置为空
emptyArray = []
/// 创建有默认值的数组
var oneArray = Array(repeating: 0.0, count: 3)
var twoArray = Array(repeating: 2.5, count: 3)
/// 两个数组相加
print(oneArray+twoArray) // [0.0, 0.0, 0.0, 2.5, 2.5, 2.5]
/// 使用字面量创建数组
var threeArray:[String] = ["字","面","量"]
/// 可以简写
var threeArray1 = ["字","面","量"]
复制代码
  1. 修改和访问数组
// 答应数组有多少个元素
print("数组threeArray1有\(threeArray1.count)个元素") //数组threeArray1有3个元素
/// 数组判空
threeArray1.isEmpty //false
/// 添加元素
threeArray1.append(".")
// 使用加法赋值运算符 (+=) 附加一个或多个兼容项的数组
threeArray1 += threeArray
print(threeArray1) // ["字", "面", "量", ".", "字", "面", "量"]
/// 使用下标来获取对应的数据
print(threeArray1[0]) // 字
/// 根据下标来设置数组元素的值
threeArray1[0] = "一"
print(threeArray1) // ["一", "面", "量", ".", "字", "面", "量"]
/// 替换一段范围内的值
threeArray1[0...3] = ["2"]
print(threeArray1) // ["2", "字", "面", "量"]
/// 在下标前插入元素
threeArray1.insert("AAA", at: 0)
print(threeArray1) //["AAA", "2", "字", "面", "量"]
/// 删除对应下标元素
threeArray1.remove(at: 0)
print(threeArray1) //["2", "字", "面", "量"]
/// 删除第一个元素
threeArray1.removeFirst()
print(threeArray1) //["字", "面", "量"]
/// 删除最后一个
threeArray1.removeLast()
print(threeArray1) //["字", "面"]
/// 遍历数组
for item in threeArray1 {
    print(item)
    // 字
    // 面
}
/*
 如果您需要每个项目的整数索引及其值,请改用 enumerated() 方法迭代数组。 对于数组中的每个项目,enumerated() 方法返回一个由整数和项目组成的元组。
 **/
for (index,ietm) in threeArray1.enumerated() {
    print("threeArray1第\(index)个元素是\(ietm)")
//    threeArray1第0个元素是字
//    threeArray1第1个元素是面
}
复制代码

集合

集合是无序且元素不能重复,当元素顺序不重要切元素值要保证唯一的时候可以使用集合。

集合类型的哈希值

一个类型必须是可散列的,才能存储在一个集合中——也就是说,该类型必须提供一种为自己计算散列值的方法。 散列值是一个Int值,对于相等比较的所有对象都相同,因此如果 a == b,则 a 的散列值等于 b 的散列值。

语法

Swift 集合的类型写为 Set< Element >,其中 Element 是集合允许存储的类型。 与数组不同,集合没有等效的简写形式。

var set:Set = Set<Element: Hashable>()
复制代码

初始化集合

使用特定类型来创建空集合

var set:Set = Set<Int>()
set.insert(1)
复制代码

字面量创建集合

您还可以使用数组字面量初始化一个集合,作为将一个或多个值写入集合集合的一种速记方式。

var set: Set<String> = ["字", "面", "量"]
复制代码

不能仅从数组字面量推断集合类型,因此必须显式声明类型 Set。 但是,由于 Swift 的类型推断,如果您使用仅包含一种类型值的数组字面量对其进行初始化,则不必编写集合元素的类型。

var set:Set = ["字", "面", "量"]
复制代码

使用集合

集合常用的方法

var set:Set = ["字", "面", "量"]
/// 获取集合项目数
print("set num \(set.count)") //set num 3
/// 判断集合是否为空
if !set.isEmpty {
    print("集合不为空")
}
/// 集合插入元素
set.insert(".")
print(set) // ["面", ".", "字", "量"]
/// 删除某个元素
set.remove(".")
print(set) // ["字", "量", "面"]
/// 删除全部元素
set.removeAll()
print(set) // []
// 判断是否包含
set.contains("22") // false
复制代码

遍历集合

var numberSet:Set = ["1","22","333"]
/// 遍历集合
for num in numberSet {
    print(num)
    //1
    //333
    //22
}
///按照特定顺序遍历
for num in numberSet.sorted() {
    print(num)
    // 1
    // 22
    // 333
}
复制代码

集合操作

我们可以将两个集合合并,确定有哪些共同的值。或者判断集合A是否全部包含集合B或者部分包含,或者没有相同元素。

1.基本集合操作

获取集合A和集合B的相同的值intersection(_:)

var A:Set = [1,2,3,4,5]
var B:Set = [5,6,7,8,9]
print(A.intersection(B)) //[5]
复制代码

获取两个集合不相同的值symmetricDifference(_:)

var A:Set = [1,2,3,4,5]
var B:Set = [5,6,7,8,9]
print(A.symmetricDifference(B)) //[1, 4, 3, 9, 8, 7, 6, 2]
复制代码

使用 union(_:) 方法创建一个包含两个集合中所有值的新集合。

var A:Set = [1,2,3,4,5]
var B:Set = [5,6,7,8,9]
print(A.union(B)) //[4, 9, 7, 3, 6, 8, 1, 5, 2]
复制代码

获取不包含指定集合的集合subtracting(_:)

var A:Set = [1,2,3,4,5]
var B:Set = [5,6,7,8,9]
print(A.subtracting(B)) //[1, 2, 3, 4]
复制代码

2.集合之间的包含关系

判断集合是否相等

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
if houseAnimals == farmAnimals {
    print("包含所有相同的值")
} else {
    print("不包含所有相同的值")
} // 不包含所有相同的值
复制代码

使用 isSubset(of:) 方法来确定一个集合的所有值是否都包含在指定的集合中。

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
houseAnimals.isSubset(of: farmAnimals) // true
复制代码

判断是否包含指定集合全部元素isSuperset(of:)

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
farmAnimals.isSuperset(of: houseAnimals) // true
复制代码

判断是否是子集或者超集

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
farmAnimals.isStrictSuperset(of: houseAnimals) // true  farmAnimals是 houseAnimals的超集
houseAnimals.isStrictSubset(of: farmAnimals) // true houseAnimals 是farmAnimals的子集
cityAnimals.isStrictSubset(of: farmAnimals) // false cityAnimals 不是是farmAnimals的子集
复制代码

判断是否没有共同的值

let houseAnimals: Set = ["?", "?"]
let farmAnimals: Set = ["?", "?", "?", "?", "?"]
let cityAnimals: Set = ["?", "?"]
houseAnimals.isDisjoint(with: farmAnimals) // false
houseAnimals.isDisjoint(with: cityAnimals) // true
复制代码

字典

字典在集合中存储相同类型的键和相同类型的值之间的关联,没有定义的顺序。 每个值都与一个唯一键相关联,该键充当字典中该值的标识符。

语法

Swift 字典的类型全写为 Dictionary<Key, Value>,其中 Key 是可以用作字典键的值类型,Value 是字典为这些键存储的值类型。

var dic:Dictionary = Dictionary<Key: Hashable, Any>()
复制代码

初始化字典

var dic:Dictionary = Dictionary<String, Any>()
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享