2014-10-28 16 views
6

Xcode 6 ha avuto un sacco di bug. Ma non sono abbastanza sicuro se questo sia un bug o no. Potrebbe non essere dato che questo è qualcosa che sto imparando proprio ora.Impossibile istanziare la sottoclasse di NSManagedObject

Il mio problema è, ogni volta che provo a istanziare il mio sottoclasse di NSManagedObject, non ho la possibilità di passare l'argomento entity: NSEntityDescription e NSManagedContext: insertIntoManagedContext al costruttore, Xcode dice "Argomento Extra 'entità' in call"

Ho creato un nuovo progetto Xcode da zero, solo per vedere se potevo ricreare il problema in un progetto più piccolo e minimale.

ToDoList.Item è impostato come classe di entità Item nell'Inspector modello dati.

Ecco il codice:

override func viewDidLoad() { 

    super.viewDidLoad() 

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    let context: NSManagedObjectContext = appDel.managedObjectContext! 

    let ent = NSEntityDescription.entityForName("Item", inManagedObjectContext: context)! 

    //compiler complains here 
    var item = Item(entity: ent, insertIntoManagedObjectContext: context)! 

} 

Ecco la sottoclasse:

import UIKit 
import CoreData 

class Item: NSManagedObject { 

    @NSManaged var title: String 
    @NSManaged var completed: Bool 

} 

Tutto l'aiuto è apprezzato.

risposta

5

appena incontrato lo stesso problema: Init method for core data entity not available

Ovviamente dobbiamo implementare il metodo

init(entity: NSEntityDescription, insertIntoManagedObjectContext context, NSManagedObjectContext?) 

nel nostro costume della classe NSManagedObject. Quindi aggiungi solo

override init(entity: NSEntityDescription, insertIntoManagedObjectContext context: NSManagedObjectContext?) { 
    super.init(entity: entity, insertIntoManagedObjectContext: context) 
} 

alla classe di entità e funzionerà.

+0

Questo deve essere richiesto in una versione recente dell'SDK. Ho visto M2KDev su youtube farlo senza. –

1

Prova la linea finale senza punto esclamativo, in questo modo:

var item = Item(entity: ent, insertIntoManagedObjectContext: context) 

E forse non aver aggiunto il nome dell'applicazione per il nome della classe:

classi Swift sono namespace: sono sono associati al modulo (tipicamente, il progetto) in cui sono compilati. Per utilizzare una sottoclasse Swift della classe NSManagedObject con il modello Core Data, anteporre il nome della classe nel campo Classe nell'ispettore dell'entità modello con il nome del modulo.

Class name https://developer.apple.com/library/mac/documentation/Swift/Conceptual/BuildingCocoaApps/WritingSwiftClassesWithObjective-CBehavior.html

+0

Ho detto sopra ... "ToDoList.Item è impostato come classe Entità elemento nell'Inspector del modello di dati." ToDoList è il nome del progetto. La rimozione del punto esclamativo genera errori. Grazie per la tua indicazione, comunque –