Получить объект по индексу в Set <T>

В Swift 1.2 есть объект Set, который вы можете использовать для создания статического типизированного Set.

Я не могу узнать, как получить объект по определенному индексу. Он имеет subscript, который позволяет вам делать следующее: mySet[setIndex].

Это возвращает объект в этом setIndex. Но теперь я хочу получить объект по определенному индексу Int.

var myObject = mySet[sIndex];

Но как мне создать SetIndex с определенным "индексом"?

Ответы

Ответ 1

Подобно String, вы должны advance() из .startIndex

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

ДОБАВЛЕНО: Начиная с Xcode7 beta6/Swift2.0:

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

Swift 3

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

Ответ 2

Set неупорядочен, поэтому объект в индексе является неопределенной концепцией поведения.

На практике вы можете построить произвольную упорядоченную структуру из набора, а затем выбрать объект по индексу в этой упорядоченной структуре.

Может быть, не оптимально, но легко достижимо:

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

Примечание: если вам нужен случайный элемент, начиная с Swift 4.2, вы получите удобное решение:

let myRandomObject = mySet.randomElement()

Ответ 3

Тип индекса 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".