У меня Set от Ints:
var mySet = Set<Int>()
mySet.insert(1)
mySet.insert(2)
// ....
// How to iterate over it and, for example, add 1 to each element?
for (index, _) in mySet.enumerated() {
// How to subscript? A set is unordered!
}
Я хочу модифицировать mySet и провести с ним дополнительные вычисления. Как я могу изменить каждый элемент в mySet? Я могу создать еще один временный mySet Set и добавить копии к этому Set, а позже назначить временный mySet Set исходному mySet, но мне было интересно, есть ли другой лучший способ.
// Ugly method?
var mySetTemp = Set<Int>()
for value in mySet {
mySetTemp.insert(value + 1)
}
mySet = mySetTemp
Есть ли способ сделать это без создания дополнительных объектов просто ради изменения исходного значения в итерации Set или Structs?
Когда Set был Array, я мог легко сделать это, индексируя элементы по индексу, но поскольку Sets неупорядочены, я не могу этого сделать.
Связанный: Расширение Swift map (_ :) для Set ()?
@MartinR Ой, это определенно связано :)





Вы можете назначить mySet как отображенный mySet, преобразованный в Set
mySet = Set(mySet.map { $0 + 1 })
Я имею в виду, что это просто складывание двух значений, возвращаемое значение не используется.
Вам нужно будет сделать что-то вроде mySet = Set(mySet.map { $0 + 1})
@dan Я думаю, что это тоже не пойдет на пользу. $ 0 + 1 возвращает int, верно? Но с возвращаемым значением ничего не поделаешь
@ J.Doe Что ты имеешь в виду? Он возвращает массив измененных значений, а затем преобразует его в новый набор.
Это правильный ответ. Не беспокойтесь о создании дубликатов, пока вы не определите это как фактическое узкое место в производительности.
Set соответствует Collection, но не MutableCollection, поэтому вы не можете изменять элементы на месте.