Swift Insieme a Matrice

Un NSSet può essere convertito in Array utilizzando set.allObjects() ma non c’è nessun tale metodo nel nuovo Set (introdotto con Swift 1.2). Si può ancora essere fatto tramite la conversione Swift Set di NSSet e utilizzare il allObjects() metodo, ma che non è ottimale.

InformationsquelleAutor Fried Rice | 2015-03-14

 

6 Replies
  1. 318

    È possibile creare un array con tutti gli elementi da un dato Swift
    Set semplicemente con

    let array = Array(someSet)

    Questo funziona perché Set è conforme alla SequenceType protocollo
    e un Array può essere inizializzato con una sequenza. Esempio:

    let mySet = Set(["a", "b", "a"])  //Set<String>
    let myArray = Array(mySet)        //Array<String>
    print(myArray) // [b, a]
    • Come nota a margine, let array = Array(someSet) funziona anche in Swift 2
    • … o lasciare myArray = myNSSet.allObjects come! [mySpecificType]
    • Sì, se un NSSet è dato. La domanda era su una Swift Set.
    • Ho ricontrollato il codice di cui sopra, esempio con entrambi Swift 2.3 e Swift 3. È compilato e ha funzionato come previsto per me. Quale errore ottieni?
    • Interessante, stavo provando con un set di un NSManagedObject rapporto, e non come la Matrice costruttore al momento – ora che provo a riprodurre il problema, però, non posso. Devo aggiungere il “arrayLiteral:” l’etichetta nella Matrice costruttore di se. Ho rimosso il mio commento precedente, in modo da non confondere nessuno, grazie per il controllo di! Non so perché la Swift guida non dispone di questo modulo per la conversione di…
  2. 17

    Nel caso più semplice, con celere 3, è possibile utilizzare Array‘s init(_:) inizializzatore di ottenere un Array da un Set. init(_:) ha la seguente dichiarazione:

    init<S>(_ s: S) where S : Sequence, Element == S.Iterator.Element

    Crea un array contenente gli elementi di una sequenza.

    Uso:

    let stringSet = Set(arrayLiteral: "car", "boat", "car", "bike", "toy")    
    let stringArray = Array(stringSet)
    
    print(stringArray)
    // may print ["toy", "car", "bike", "boat"]

    Tuttavia, se si desidera eseguire alcune operazioni su ogni elemento del vostro Set mentre trasformandolo in un Array, è possibile utilizzare map, flatMap, sort, filter e altri metodi funzionali forniti da Collection protocollo:

    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]
    • Utilizzando uno di questi metodi che posso fare serie facoltativa dal set opzionale.
  3. 10

    AGGIUNTA :

    Swift non ha ORDINE DEFINITO per Impostare e Dizionario.Per questo motivo, si dovrebbero utilizzare ordinati() metodo per evitare di ottenere risultati inaspettati, come la matrice può essere come [“a”,”b”] o [“b”,”a”] e tu non vuoi questo.

    PER RISOLVERE QUESTO PROBLEMA:

    PER IMPOSTA

    var example:Set = ["a","b","c"]
    let makeExampleArray = [example.sorted()]
    makeExampleArray 

    Risultato: [“a”,”b”,”c”]

    Senza ordinati()

    Può essere:

    ["a","b","c"] or ["b","c","a",] or ["c","a","b"] or ["a","c","b"] or ["b","a","c"] or ["c","b","a"] 

    semplice matematica : 3! = 6

  4. 7

    Ho creato una semplice estensione che ti dà un indifferenziati Array come una proprietà di Set in Swift 4.0.

    extension Set {
        var array: [Element] {
            return Array(self)
        }
    }

    Se si desidera un array ordinato, è possibile aggiungere un ulteriore calcolata proprietà, o modificare quello esistente per soddisfare le vostre esigenze.

    Di utilizzare questo, basta chiamare

    let array = set.array
  5. 3

    La risposta rapida 2.x e superiore (dal Linguaggio di Programmazione Swift guida sui Tipi di Raccolta) sembra essere a scorrere i Set di voci come:

    for item in myItemSet {
       ...
    }

    O, per usare le “ordinate” metodo:

    let itemsArray = myItemSet.sorted()

    Sembra che la Swift designer non come allObjects come un meccanismo di accesso perché i Set non sono realmente ordinato, così che ha voluto assicurarsi che non è uscita un array senza un esplicito ordine applicata.

    Se non si desidera che il sovraccarico di ordinamento e non importa l’ordine, io di solito uso la mappa o flatMap metodi che dovrebbero essere un po ‘ più veloce per estrarre un array:

    let itemsArray = myItemSet.map { $0 }

    Che costruire un array di tipo Set contiene, se avete bisogno di essere un array di un tipo specifico (per esempio, il diritto da un insieme di oggetti gestiti i rapporti che non sono dichiarate come un digitato set) è possibile fare qualcosa di simile:

    var itemsArray : [MyObjectType] = []
    if let typedSet = myItemSet as? Set<MyObjectType> {
     itemsArray = typedSet.map { $0 }
    }
    • myItemSet.sorted() richiede che gli elementi sono Comparable. – myItemSet.map { $0 } dovrebbe produrre lo stesso risultato Array(myItemSet), sia per creare un array con l’enumerazione di tutti gli elementi del set. Quest’ultimo lavora ancora per me, alcuni dettagli sul tuo commento di cui sopra sarebbe apprezzato.
  6. -2

    chiamata di questo metodo e passare il vostro set

    func getArrayFromSet(set:NSSet)-> NSArray {
    
    return set.map ({ String($0) })
    }

    Come Questo :

    var letters:Set = Set<String>(arrayLiteral: "test","test") //your set
    print(self.getArrayFromSet(letters))
    • Utilizzare Array(<Set> è una scelta migliore

Lascia un commento