Um NSSet
pode ser convertido para Array
uso, set.allObjects()
mas não existe esse método no novo Set
(introduzido no Swift 1.2). Isso ainda pode ser feito convertendo o Swift Set para NSSet e use o allObjects()
método, mas isso não é o ideal.
Um NSSet
pode ser convertido para Array
uso, set.allObjects()
mas não existe esse método no novo Set
(introduzido no Swift 1.2). Isso ainda pode ser feito convertendo o Swift Set para NSSet e use o allObjects()
método, mas isso não é o ideal.
Respostas:
Você pode criar uma matriz com todos os elementos de um determinado Swift
Set
simplesmente com
let array = Array(someSet)
Isso funciona porque Set
está em conformidade com o SequenceType
protocolo e Array
pode ser inicializado com uma sequência. Exemplo:
let mySet = Set(["a", "b", "a"]) // Set<String>
let myArray = Array(mySet) // Array<String>
print(myArray) // [b, a]
NSSet
for fornecido. A pergunta era sobre um Swift Set
.
No caso mais simples , com o Swift 3, você pode usar Array
o init(_:)
inicializador para obter um Array
de a Set
. init(_:)
tem a seguinte declaração:
init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element
Cria uma matriz que contém os elementos de uma sequência.
Uso:
let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")
let stringArray = Array(stringSet)
print(stringArray)
// may print ["toy", "car", "bike", "boat"]
No entanto , se você também quiser executar algumas operações em cada elemento do seu Set
enquanto transformando-o em um Array
, você pode usar map
, flatMap
, sort
, filter
e outros métodos funcionais previstos pelo Collection
protocolo:
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]
ADIÇÃO :
Swift não possui ORDEM DEFINIDA para Conjunto e Dicionário. Por esse motivo, você deve usar o método classificado () para impedir a obtenção de resultados inesperados, como sua matriz, pode ser como ["a", "b"] ou ["b", "a "] e você não quer isso.
Para corrigir isso:
PARA CONJUNTOS
var example:Set = ["a","b","c"]
let makeExampleArray = [example.sorted()]
makeExampleArray
Resultado: ["a", "b", "c"]
Sem classificado ()
Pode ser:
["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"]
matemática simples: 3! = 6
Eu criei uma extensão simples que fornece Array
uma propriedade não classificada como Set
no Swift 4.0 .
extension Set {
var array: [Element] {
return Array(self)
}
}
Se você deseja uma matriz classificada, pode adicionar uma propriedade computada adicional ou modificar a existente para atender às suas necessidades.
Para usar isso, basta ligar
let array = set.array
A resposta atual para o Swift 2.xe superior (do guia Swift Programming Language sobre Tipos de coleção) parece ser uma iteração sobre as entradas do conjunto da seguinte maneira:
for item in myItemSet {
...
}
Ou, para usar o método "classificado":
let itemsArray = myItemSet.sorted()
Parece que os designers do Swift não gostaram de allObjects como um mecanismo de acesso porque Sets não são realmente ordenados, então eles queriam garantir que você não saísse de uma matriz sem uma ordem explícita aplicada.
Se você não deseja a sobrecarga da classificação e não se importa com a ordem, normalmente uso os métodos map ou flatMap, que devem ser um pouco mais rápidos para extrair uma matriz:
let itemsArray = myItemSet.map { $0 }
O que criará uma matriz do tipo que o conjunto mantém; se você precisar de uma matriz de um tipo específico (digamos, direitos de um conjunto de relações de objeto gerenciado que não são declaradas como um conjunto digitado), você pode fazer algo como:
var itemsArray : [MyObjectType] = []
if let typedSet = myItemSet as? Set<MyObjectType> {
itemsArray = typedSet.map { $0 }
}
myItemSet.sorted()
requer que os elementos sejam Comparable
. - myItemSet.map { $0 }
deve produzir o mesmo resultado que Array(myItemSet)
, ambos criam uma matriz enumerando todos os elementos do conjunto. O último ainda funciona para mim, alguns detalhes sobre o seu comentário acima seriam apreciados.
chame esse método e passe seu conjunto
func getArrayFromSet(set:NSSet)-> NSArray {
return set.map ({ String($0) })
}
Como isso :
var letters:Set = Set<String>(arrayLiteral: "test","test") // your set
print(self.getArrayFromSet(letters))
let array = Array(someSet)
também trabalha na Swift 2