An NSSet
можно преобразовать в Array
использование, set.allObjects()
но в новом методе такого нет Set
(введено в Swift 1.2). Это все еще может быть сделано путем преобразования набора Swift в NSSet и использования allObjects()
метода, но это не является оптимальным.
187
let array = Array(someSet)
также работает в Swift 2NSSet
дано. Вопрос был о СвифтеSet
.В простейшем случае , с Swift 3, вы можете использовать
Array
«sinit(_:)
инициализатор , чтобы получитьArray
отSet
.init(_:)
имеет следующую декларацию:Использование:
Тем не менее , если вы хотите , чтобы выполнить некоторые операции по каждому элементу вашего
Set
при преобразовании его вArray
, вы можете использоватьmap
,flatMap
,sort
,filter
и другие функциональные методы , предоставляемыеCollection
протоколом:источник
ДОПОЛНЕНИЕ:
У Swift нет ЗАДАННОГО ЗАКАЗА для Set и Dictionary. По этой причине вы должны использовать метод sorted (), чтобы предотвратить получение неожиданных результатов, например, ваш массив может иметь вид ["a", "b"] или ["b", "a "] и вы не хотите этого.
ЧТОБЫ ИСПРАВИТЬ ЭТО:
ДЛЯ КОМПЛЕКТОВ
Результат: ["a", "b", "c"]
Без сортировки ()
Может быть:
простая математика: 3! = 6
источник
Я создал простое расширение, которое дает вам несортированное
Array
свойствоSet
в Swift 4.0 .Если вы хотите отсортированный массив, вы можете добавить дополнительное вычисляемое свойство или изменить существующее в соответствии с вашими потребностями.
Чтобы использовать это, просто позвоните
источник
Текущий ответ для Swift 2.x и выше (из руководства по языку программирования Swift по типам коллекций), по-видимому, заключается в переборе записей Set, например:
Или использовать «отсортированный» метод:
Похоже, что разработчикам Swift не понравились allObjects как механизм доступа, потому что множества на самом деле не упорядочены, поэтому они хотели убедиться, что вы не получили массив без применения явного упорядочения.
Если вы не хотите накладных расходов на сортировку и не заботитесь о порядке, я обычно использую методы map или flatMap, которые должны быть немного быстрее для извлечения массива:
Который будет создавать массив типа, который содержит Set, если вам нужно, чтобы он был массивом определенного типа (скажем, дает права из набора отношений управляемых объектов, которые не объявлены как типизированный набор), вы можете сделать что-то вроде:
источник
myItemSet.sorted()
требует, чтобы элементы былиComparable
. -myItemSet.map { $0 }
должен выдать тот же результат, чтоArray(myItemSet)
и оба, создать массив путем перечисления всех элементов набора. Последнее все еще работает для меня, некоторые детали вашего комментария будут оценены.вызвать этот метод и передать свой набор
Как это :
источник