當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Swift Set用法及代碼示例

結構

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 運算符在SetNSSet 之間進行橋接。為了使橋接成為可能,集合的 Element 類型必須是類、@objc 協議(從 Objective-C 導入或標有 @objc 屬性的協議)或橋接到 Foundation 的類型類型。

SetNSSet 的橋接總是需要 O(1) 的時間和空間。當集合的Element 類型既不是類也不是@objc 協議時,任何所需的元素橋接都發生在第一次訪問每個元素時,因此使用集合內容的第一個操作(例如,成員資格測試) 可以取 O(n)。

NSSetSet 的橋接首先調用集合上的copy(with:) 方法(Objective-C 中的- copyWithZone:)以獲取不可變副本,然後執行額外的 Swift 簿記工作,這需要 O(1) 時間。對於已經不可變的NSSet 實例,copy(with:) 在恒定時間內返回相同的集合;否則,複製性能未指定。 NSSetSet 的實例使用相同的 copy-on-write 優化來共享緩衝區,這與 Set 的兩個實例共享緩衝區時使用的相同。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 Set。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。