Ryan Smith
Ryan Smith

Reputation: 694

Can't instantiate subclass of NSManagedObject

Xcode 6 has had a ton of bugs. But I'm not quite sure if this is a bug or not. It might not be since this is something I'm just now learning.

My issue is, any time I try to instantiate my subclass of NSManagedObject, I do not have the option to pass the entity: NSEntityDescription and NSManagedContext: insertIntoManagedContext argument to the constructor, Xcode says "Extra Argument 'entity' in call"

I created a new Xcode project from scratch, just to see if I could re-create the problem in a smaller, minimal project.

ToDoList.Item is set as the Item entity class in the Data Model Inspector.

Here's the code:

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)!

}

Here's the subclass:

import UIKit
import CoreData

class Item: NSManagedObject {

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

}

All help is appreciated.

Upvotes: 6

Views: 5148

Answers (3)

Viesturs Knopkens
Viesturs Knopkens

Reputation: 604

Try the final line without exclamation mark, like this:

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

And maybe You haven't added your app name to class name:

Swift classes are namespaced—they’re scoped to the module (typically, the project) they are compiled in. To use a Swift subclass of the NSManagedObject class with your Core Data model, prefix the class name in the Class field in the model entity inspector with the name of your module.

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

Upvotes: 1

DarkLeafyGreen
DarkLeafyGreen

Reputation: 70416

Just came across the same problem: Init method for core data entity not available

Obviously we have to implement the

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

method in our custom NSManagedObject class. So just add

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

to your entity class and it will work.

Upvotes: 6

pyj
pyj

Reputation: 1499

Are constructors inherited in Swift?

I'd try using NSEntityDescription.insertNewObjectForEntityForName:inManagedObjectContext

Upvotes: 0

Related Questions