2015-08-21 13 views
8

In Swift 2.0, le relazioni uno-a-molti in Dati principali sono ancora NSOrderedSet?Swift 2.0 relazione uno-a-molti - ancora NSOrderedSet?

Non riesco a essere in grado di eseguire correttamente il cast/downcast per non generare errori.

Qualcuno ha un semplice esempio di questo in Swift 2.0?

risposta

1

Sfortunatamente CoreData con swift è ancora un dolore enorme soprattutto con le relazioni one-many ordinate. Sì, è ancora NSOrderedSet che viene utilizzato da CoreData per molte relazioni. La domanda è come aggiungere/rimuovere elementi a questo. Xcode non è mai stato in grado di generare accessors correttamente per il set ordinato finora - anche in Objective e Swift !!.

C'è questa discussione sul risparmio a-molti rapporti a Swift: How to define CoreData relationship in Swift?

Ma, ahimè !, niente di cui questa discussione sempre opera nel mondo Swift 2.0. Allora, qual è la soluzione per ora? Ho inserito questo e l'unico modo per farlo funzionare è generare le fonti per le entità in questione, in Objective C, e non in swift ed esportare le intestazioni di esse nell'intestazione del bridging. Inoltre è necessario assicurarsi di includere un importante fix soluzione per Xcode per generare funzioni di accesso corretti per insieme ordinato:

https://github.com/CFKevinRef/KCOrderedAccessorFix

È necessario assicurarsi di call- model.kc_generateOrderedSetAccessors() nel modello codice di creazione in AppDelegate per invocare questa correzione.

Una volta terminato, ora è possibile iniziare a utilizzare in modo sicuro gli accessori generati sul modello per aggiungere elementi a una relazione to-many.

ho creato un progetto di esempio ed è in github e spero che helps-

https://github.com/shripada/CoreDataToManyRelationshipInSwift2.0

+1

Si scopre che è diventato più semplice in XCode 7 beta 5. Core Data ora utilizza NSSet per le relazioni uno-a-molti. Creare un NSMutableSet come "let clientSet: NSMutableSet = []" quindi aggiungere un oggetto Core Data al set "clientsSet.addobject (aClientObject)" e quindi inserire il set nella relazione come "event.clients = clientsSet" e tu " fatto. Tutto quello che dovevo fare era rigenerare le mie lezioni che non funzionavano (come il mio evento). Stavo ancora usando alcune classi generate da Core Data in XCode 7 beta 4 e questo mi stava rovinando (l'evento stava usando NSOrderedSet piuttosto che NSSet). – Kent

+0

Oh, è bello sapere, il mio era Xcode 7, beta 4. – Shripada

4

Solo se si contrassegna il rapporto con l'opzione "ordinato". In caso contrario, è un NSSet.

non sono d'accordo con la risposta accettata perché in Swift 2.0 colmare da NSSet ad un Set avviene automaticamente, quindi se è possibile creare una sottoclasse l'entità CoreData, si può semplicemente scrivere:

@NSManaged var oneToManyOfTypeFoo: Set<Foo> 

E poi l'aggiunta di e rimuovere elementi diventa banale, perché puoi semplicemente utilizzare i metodi insert e remove da Set.

+0

Quando hai scelto l'opzione ordinata Xcode aggiunge automaticamente NSOrderedSet invece di NSSet e non puoi usare con NSOrderedSet. Come gestire le operazioni relative all'ordine con Set ? Grazie... – emreoktem

+1

'NSOrderedSet' è una struttura diversa e non può essere castato in' Set'. Come ho visto tu hai due opzioni: la prima è di attenersi a 'NSOrderedSet', quindi la mia risposta è irrilevante per te. L'altro è deselezionare l'opzione ordinata e usare un 'Set'. Quindi puoi ordinarlo: 'myset.sorted (by:)' – FranMowinckel

Problemi correlati