Set
聲明
@frozen struct Set<Element> where Element : Hashable
概述
當您需要有效地測試成員資格並且您不關心集合中元素的順序,或者當您需要確保每個元素在集合中隻出現一次時,您可以使用集合而不是數組。
您可以使用符合Hashable
協議的任何元素類型創建集合。默認情況下,標準庫中的大多數類型都是可散列的,包括字符串、數字和布爾類型、沒有關聯值的枚舉情況,甚至是集合本身。
Swift 讓創建一個新集合就像創建一個新數組一樣容易。隻需將數組文字分配給指定 Set
類型的變量或常量。
let ingredients: Set = ["cocoa beans", "sugar", "cocoa butter", "salt"]
if ingredients.contains("sugar") {
print("No thanks, too sweet.")
}
// Prints "No thanks, too sweet."
設置操作
集合提供了一套數學集合操作。例如,您可以有效地測試一個集合的元素成員資格或檢查它與另一個集合的交集:
-
使用
contains(_:)
方法測試集合是否包含特定元素。 -
使用 “equal to” 運算符 (
==
) 來測試兩個集合是否包含相同的元素。 -
使用
isSubset(of:)
方法測試一個集合是否包含另一個集合或序列的所有元素。 -
使用
isSuperset(of:)
方法測試一個集合的所有元素是否包含在另一個集合或序列中。 -
使用
isStrictSubset(of:)
和isStrictSuperset(of:)
方法來測試一個集合是否是另一個集合的子集或超集,但不等於另一個集合。 -
使用
isDisjoint(with:)
方法測試一個集合是否與另一個集合有任何共同的元素。
您還可以組合、排除或減去兩個集合的元素:
-
使用
union(_:)
方法創建一個包含一個集合的元素和另一個集合或序列的新集合。 -
使用
intersection(_:)
方法創建一個新集合,其中僅包含一個集合和另一個集合或序列共有的元素。 -
使用
symmetricDifference(_:)
方法創建一個新集合,其中包含在一個集合或另一個集合或序列中的元素,但不能同時在兩者中。 -
使用
subtracting(_:)
方法創建一個新集合,其中包含一個集合中不在另一個集合或序列中的元素。
您可以使用這些方法的變異對應項來修改集合:formUnion(_:)
、formIntersection(_:)
、formSymmetricDifference(_:)
和subtract(_:)
。
集合操作不限於與其他集合一起使用。相反,您可以對另一個集合、數組或任何其他序列類型執行集合操作。
var primes: Set = [2, 3, 5, 7]
// Tests whether primes is a subset of a Range<Int>
print(primes.isSubset(of: 0..<10))
// Prints "true"
// Performs an intersection with an Array<Int>
let favoriteNumbers = [5, 7, 15, 21]
print(primes.intersection(favoriteNumbers))
// Prints "[5, 7]"
序列和集合操作
除了 Set
類型的集合操作之外,您還可以對集合使用任何非可變序列或集合方法。
if primes.isEmpty {
print("No primes!")
} else {
print("We have \(primes.count) primes.")
}
// Prints "We have 4 primes."
let primesSum = primes.reduce(0, +)
// 'primesSum' == 17
let primeStrings = primes.sorted().map(String.init)
// 'primeStrings' == ["2", "3", "5", "7"]
您可以使用 for
- in
循環遍曆集合的無序元素。
for number in primes {
print(number)
}
// Prints "5"
// Prints "7"
// Prints "2"
// Prints "3"
許多序列和集合操作返回一個數組或 type-erasing 集合包裝器而不是集合。要恢複有效的集合操作,請從結果中創建一個新集合。
let primesStrings = primes.map(String.init)
// 'primesStrings' is of type Array<String>
let primesStringsSet = Set(primes.map(String.init))
// 'primesStringsSet' is of type Set<String>
Set 和 NSSet 之間的橋接
您可以使用as
運算符在Set
和NSSet
之間進行橋接。為了使橋接成為可能,集合的 Element
類型必須是類、@objc
協議(從 Objective-C 導入或標有 @objc
屬性的協議)或橋接到 Foundation 的類型類型。
從 Set
到 NSSet
的橋接總是需要 O(1) 的時間和空間。當集合的Element
類型既不是類也不是@objc
協議時,任何所需的元素橋接都發生在第一次訪問每個元素時,因此使用集合內容的第一個操作(例如,成員資格測試) 可以取 O(n
)。
從NSSet
到Set
的橋接首先調用集合上的copy(with:)
方法(Objective-C 中的- copyWithZone:
)以獲取不可變副本,然後執行額外的 Swift 簿記工作,這需要 O(1) 時間。對於已經不可變的NSSet
實例,copy(with:)
在恒定時間內返回相同的集合;否則,複製性能未指定。 NSSet
和 Set
的實例使用相同的 copy-on-write 優化來共享緩衝區,這與 Set
的兩個實例共享緩衝區時使用的相同。
可用版本
相關用法
- Swift SetAlgebra isStrictSubset(of:)用法及代碼示例
- Swift Set subtracting(_:)用法及代碼示例
- Swift Set remove(_:)用法及代碼示例
- Swift Set prefix(upTo:)用法及代碼示例
- Swift Set subscript(_:)用法及代碼示例
- Swift Set.Index ...(_:_:)用法及代碼示例
- Swift Set update(with:)用法及代碼示例
- Swift Set formIntersection(_:)用法及代碼示例
- Swift SetAlgebra remove(_:)用法及代碼示例
- Swift Set dropFirst(_:)用法及代碼示例
- Swift Set joined(separator:)用法及代碼示例
- Swift Set min()用法及代碼示例
- Swift Set elementsEqual(_:)用法及代碼示例
- Swift Set init(arrayLiteral:)用法及代碼示例
- Swift SetAlgebra isDisjoint(with:)用法及代碼示例
- Swift Set min(by:)用法及代碼示例
- Swift Set symmetricDifference(_:)用法及代碼示例
- Swift Set joined()用法及代碼示例
- Swift Set isDisjoint(with:)用法及代碼示例
- Swift SetAlgebra symmetricDifference(_:)用法及代碼示例
- Swift Set shuffled()用法及代碼示例
- Swift SetAlgebra subtract(_:)用法及代碼示例
- Swift Set contains(_:)用法及代碼示例
- Swift Set isStrictSubset(of:)用法及代碼示例
- Swift Set max(by:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Set。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。