Swift 集合 Set

Swift 集合 Set

Set 同 Array 的声明方式很类似,但他是一个无序集合,且内部元素不重复。

由于 Set 集合同 Array 的声明十分相似,所以要指出声明的是一个 Set 变量,否则默认就是 Array 变量。

var set1: Set<Character> = []
var set2 = Set<Character>()
var set3: Set = ["a","b"]

作为一个集合概念,Swift 的官方 API 中实现了许多数学操作,如一个集合是否是另一个集合的(真)子集,两个集合是否是互斥的,以及对两个集合进行合并、相交、相减等操作。

但是,这些操作并不是限于两个集合之间,集合和其他遵循 Sequence 协议的类型,如 Array 、Range 等,亦可。

并且,Set 变量还可以使用序列或集合中的一些方法。

let set1: Set = ["a","b"]
let result = set1.reduce("", + )
print(result)

输出:ab

同样的,使用 as 可以将 Set 转换为 NSSet ,只是元素的类型应是类,或者是遵循经 @objc 修饰的协议的类型。且 Set 和 NSSet 转换时,共享同一片内存中的数据,直到发生修改。

常用方法

下面两个方法是对两个集合做差,但是前者是将元素从自身集合中移除,而后者则是返回一个新的集合。

@inlinable public mutating func subtract(_ other: Set<Element>)
@inlinable public __consuming func subtracting(_ other: Set<Element>) -> Set<Element>

下面的方法实际是用两个集合的并集减去两个集合的交集,得到的结果是两个集合各自所拥有的元素的集合。

@inlinable public mutating func formSymmetricDifference(_ other: __owned Set<Element>)

通过下面的方法,可以对集合中的值逐一处理,得到最终的结果。

let set1: Set = ["a","b","1","2","3","c"]
let dic: Dictionary<String,Int> = [:]
let count = set1.reduce(into: dic) { result, string in
    if let number = Int(string) {
        result["number", default: 0] += 1
    }else {
        result["string", default: 0] += 1
    }
}
print(count)
print(dic)

输出如下:

["number": 3, "string": 3]
[:]

可知,reduce(into:_:) 方法中,虽然闭包参数中的 result 参数使用 inout 修饰后,通过引用传参,修改的始终是同一个变量,但是,初始化该变量的参数仍然是拷贝的。

集合 Set 中同样有索引的概念,使用下面的方法可以获取第一个满足条件的元素的索引。

@inlinable public func firstIndex(where predicate: (Element) throws -> Bool) rethrows -> Set<Element>.Index?

@inlinable public subscript(position: Set<Element>.Index) -> Element { get }

可以通过下面的方式,获取指定的元素在集合中的索引。

let set1: Set = ["a","b","1","2","3","c"]
if let index = set1.index(of: "a") {
    print(set1[index])
}
发布了129 篇原创文章 · 获赞 23 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/u011374318/article/details/100148476
今日推荐