An NSSet
можно преобразовать в Array
с помощью set.allObjects()
, но в новом Set
(введенном с Swift 1.2) такого метода нет. Это можно сделать, преобразование Swift Set в NSSet и использование метода allObjects()
, но это не оптимально.
Swift Set to Array
Ответ 1
Вы можете создать массив со всеми элементами из данного Swift
Set
просто с
let array = Array(someSet)
Это работает, потому что Set
соответствует протоколу SequenceType
и Array
можно инициализировать с помощью последовательности. Пример:
let mySet = Set(["a", "b", "a"]) // Set<String>
let myArray = Array(mySet) // Array<String>
print(myArray) // [b, a]
Ответ 2
В простейшем случае, с Swift 3, вы можете использовать Array
init(_:)
initializer для получите Array
от Set
. init(_:)
имеет следующее объявление:
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
Создает массив, содержащий элементы последовательности.
Использование:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
Однако, если вы также хотите выполнять некоторые операции над каждым элементом вашего Set
, а затем преобразовывая его в Array
, вы можете использовать map
, flatMap
, sort
, filter
и другие функциональные методы, предоставляемые протоколом Collection
:
let stringSet = Set(["car", "boat", "bike", "toy"])
let stringArray = stringSet.sorted()
print(stringArray)
// will print ["bike", "boat", "car", "toy"]
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = stringSet.filter { $0.characters.first != "b" }
print(stringArray)
// may print ["car", "toy"]
let intSet = Set([1, 3, 5, 2])
let stringArray = intSet.flatMap { String($0) }
print(stringArray)
// may print ["5", "2", "3", "1"]
let intSet = Set([1, 3, 5, 2])
// alternative to `let intArray = Array(intSet)`
let intArray = intSet.map { $0 }
print(intArray)
// may print [5, 2, 3, 1]
Ответ 3
ДОПОЛНЕНИЕ:
Swift не имеет ОПРЕДЕЛЕННЫЙ ЗАКАЗ для набора и словаря. По этой причине вам следует использовать метод sorted(), чтобы предотвратить получение неожиданных результатов, например, ваш массив может быть как [ "a", "b" ] или [ "b", "a" ], и вы не хотите этого.
ИСПОЛЬЗОВАТЬ ЭТО:
ДЛЯ SETS
var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray
Результат: [ "a", "b", "c" ]
Без сортировки()
Это может быть:
["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"]
простая математика: 3!= 6
Ответ 4
Текущий ответ для Swift 2.x и выше (из руководства Swift Programming Language in Collection Types), похоже, должен либо перебираться по настройкам так:
for item in myItemSet {
...
}
Или, чтобы использовать "отсортированный" метод:
let itemsArray = myItemSet.sorted()
Кажется, дизайнерам Swift не понравилось allObjects в качестве механизма доступа, потому что Sets на самом деле не упорядочены, поэтому они хотели удостовериться, что вы не выбрали массив без явного упорядочения.
Если вы не хотите накладных расходов на сортировку и не заботитесь о порядке, я обычно использую методы map или flatMap, которые нужно немного быстрее извлечь массив:
let itemsArray = myItemSet.map { $0 }
Что будет строить массив типа, который имеет Set, если вам нужно, чтобы он был массивом определенного типа (например, права на набор отношений управляемых объектов, которые не объявлены как типизированный набор), вы можете сделать что-то вроде:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
Ответ 5
Я создал простое расширение, которое дает вам несортированный массив как свойство Set in Swift 3.0.
extension Set {
var array: [Element]? {
return Array(self)
}
}
Если вы хотите отсортированный массив, вы можете либо добавить дополнительное вычисляемое свойство, либо изменить существующее в соответствии с вашими потребностями.
Чтобы использовать это, просто позвоните
let array = set.array
Ответ 6
вызовите этот метод и передайте свой набор
func getArrayFromSet(set:NSSet)-> NSArray {
return set.map ({ String($0) })
}
Как это:
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))