Получить объект по индексу в 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".