获取 Set<T> 中索引处的对象

Get object at index in Set<T>

在 Swift 1.2 中有一个 Set 对象,您可以使用它来创建静态类型的 Set。

我找不到如何获取某个索引处的对象。它有一个 subscript 允许您执行以下操作:mySet[setIndex].

这会检索 setIndex 处的对象。但是现在我想从某个Int索引中获取一个对象。

var myObject = mySet[sIndex];

但是如何创建具有特定 'index' 的 SetIndex?

Swift 3 及更高版本

您可以 offsetBy: 来自 .startIndex:

let mySet: Set = ["a", "b", "c", "d"]
mySet[mySet.index(mySet.startIndex, offsetBy: 2)] // -> something from the set.

Swift 2(过时)

您可以 advancedBy() 来自 .startIndex:

let mySet: Set = ["a", "b", "c", "d"]
mySet[mySet.startIndex.advancedBy(2)] // -> something from the set.

Swift 1.x(过时)

类似于String,你必须advance().startIndex:

let mySet: Set = ["a", "b", "c", "d"]
mySet[advance(mySet.startIndex, 2)] // -> something from the set.

一个Set是无序的,所以索引处的对象是一个未定义的行为概念。

实际上,您可以从 Set 中构建任意有序结构,然后在该有序结构中的索引处选择一个对象。

可能不是最优的,但很容易实现:

let myIndex = 1
let myObject = Array(mySet)[myIndex]

注意:如果你需要一个随机元素,从Swift 4.2开始你会得到一个方便的解决方案:

let myRandomObject = mySet.randomElement()

Set 的索引类型不是 Int。因此,您不能使用 Int 下标检索对象,即 mySet[2].

您将不得不使用 Set<String>.Index

类型的索引
let mySet: Set = ["a", "b", "c", "d"]
var indices = [Set<String>.Index]()
for index in mySet.indices
{
    indices.append(index)
}
let thirdIndex = indices[2]
print(mySet[thirdIndex]) // prints d (for example)

但是,与 Array 不同,Set 是无序的。因此,正如@Martin 指出的那样,索引 2 处的对象不一定是 "c".