NSSet
Można przekształcić w Array
użyciu set.allObjects()
, ale nie istnieje metoda, w nowej Set
(wprowadzone szybkimi 1.2). Nadal można to zrobić, konwertując Swift Set na NSSet i używając allObjects()
metody, ale nie jest to optymalne.
NSSet
Można przekształcić w Array
użyciu set.allObjects()
, ale nie istnieje metoda, w nowej Set
(wprowadzone szybkimi 1.2). Nadal można to zrobić, konwertując Swift Set na NSSet i używając allObjects()
metody, ale nie jest to optymalne.
Odpowiedzi:
Możesz utworzyć tablicę ze wszystkimi elementami z danego Swift
Set
po prostu za pomocą
let array = Array(someSet)
Działa to, ponieważ Set
jest zgodne z SequenceType
protokołem i Array
można go zainicjować sekwencją. Przykład:
let mySet = Set(["a", "b", "a"]) // Set<String>
let myArray = Array(mySet) // Array<String>
print(myArray) // [b, a]
NSSet
podano. Pytanie dotyczyło Szybkiego Set
.
W najprostszym przypadku , ze Swift 3, można użyć Array
„s init(_:)
inicjator dostać Array
z punktu A Set
. init(_:)
ma następującą deklarację:
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
Tworzy tablicę zawierającą elementy sekwencji.
Stosowanie:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
Jednakże , jeśli chcesz, aby wykonać pewne operacje na każdego elementu Set
podczas przekształcania go w produkt Array
, można użyć map
, flatMap
, sort
, filter
i inne metody funkcjonalne świadczone przez Collection
protokół:
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]
DODATEK:
Swift nie ma DEFINIOWANEGO ZAMÓWIENIA dla Seta i Dictionary. Z tego powodu powinieneś użyć metody sorted (), aby zapobiec otrzymywaniu nieoczekiwanych wyników, takich jak tablica może być jak [„a”, „b”] lub [„b”, „a „] i nie chcesz tego.
ABY NAPRAWIĆ TO:
DLA ZESTAWÓW
var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray
Wynik: [„a”, „b”, „c”]
Bez sortowania ()
To może być:
["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"]
prosta matematyka: 3! = 6
Stworzyłem proste rozszerzenie, które daje nieposortowane Array
jako właściwość Set
w Swift 4.0 .
extension Set {
var array: [Element] {
return Array(self)
}
}
Jeśli chcesz posortować tablicę, możesz dodać dodatkową właściwość obliczoną lub zmodyfikować istniejącą według własnych potrzeb.
Aby z tego skorzystać, wystarczy zadzwonić
let array = set.array
Obecna odpowiedź dla Swift 2.x i nowszych (z przewodnika Swift Programming Language na temat rodzajów kolekcji) wydaje się polegać na iteracji po wpisach Set w następujący sposób:
for item in myItemSet {
...
}
Lub, aby użyć metody „posortowanej”:
let itemsArray = myItemSet.sorted()
Wygląda na to, że projektanci Swift nie lubili allObjects jako mechanizmu dostępu, ponieważ zestawy nie są tak naprawdę uporządkowane, więc chcieli się upewnić, że nie wyjdzie z tablicy bez zastosowania jawnego uporządkowania.
Jeśli nie chcesz narzucać sortowania i nie przejmujesz się kolejnością, zwykle używam metod map lub flatMap, które powinny być nieco szybsze do wyodrębnienia tablicy:
let itemsArray = myItemSet.map { $0 }
Który zbuduje tablicę typu, który posiada Zestaw, jeśli potrzebujesz, aby była tablicą określonego typu (powiedzmy, że uprawnia z zestawu relacji zarządzanych obiektów, które nie są zadeklarowane jako zbiór typowy), możesz zrobić coś takiego:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
myItemSet.sorted()
wymaga, aby elementy były Comparable
. - myItemSet.map { $0 }
powinien dać ten sam wynik, ponieważ Array(myItemSet)
oba tworzą tablicę, wyliczając wszystkie elementy zestawu. To drugie nadal działa dla mnie, niektóre szczegóły dotyczące powyższego komentarza będą mile widziane.
wywołaj tę metodę i przekaż swój zestaw
func getArrayFromSet(set:NSSet)-> NSArray {
return set.map ({ String($0) })
}
Lubię to :
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))
let array = Array(someSet)
działa również w Swift 2