2014-11-29 5 views
7

Ich brauche eine gemeinsame Schnittstelle für ein NSManagedObject und ein reguläres NSObject. In Objective-c könnte ich dafür ein Protokoll verwenden. Aber in Swift bekomme ich diesen Laufzeitfehler. Irgendeine Lösungsmöglichkeit? Danke im Voraus!NSManagedObject Kann nicht mit dem Protokoll in Swift

protocol Product { var code: String { get set } var sp: String { get set } }

class Stock: NSManagedObject, Product { 

@NSManaged var code: String 
@NSManaged var sp: String 

}

Fehler: Nicht definierte Symbole für Architektur i386: "__TFC11YellowPages5Stockg2spSS", verwiesen von: __TFC11YellowPages5Stockm2spSS in Stock.o "__TFC11YellowPages5Stockg4codeSS", verwiesen von: __TFC11YellowPages5Stockm4codeSS in Stock.o ld: Symbol (e) nicht für Architektur gefunden i386 clang: Fehler: Linker Befehl fehlgeschlagen wit h exit code 1 (benutze -v um den Aufruf zu sehen)

+1

Haben Sie @objc zu Beginn versucht, indem von deinem Protokoll? –

+0

Ich habe es gerade versucht, aber es funktioniert immer noch nicht. @ DanielT. – WeaponJ

Antwort

6

Das funktionierte für mich. Versuchen Sie selbst und sehen, ob es funktioniert:

class MyEntity: NSManagedObject { 

    @NSManaged var testAttribute: String 
} 

@objc 
protocol MyProtocol { 

    var testAttribute: String { get set } 
} 

extension MyEntity: MyProtocol { } 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
     let myContext = appDelegate.managedObjectContext! 
     let entity: MyEntity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: myContext) as MyEntity 
     foo(entity) 
     println(entity.testAttribute) 
    } 

    func foo(var object: MyProtocol) { 
     object.testAttribute = "bar" 
    } 
} 

Die unten auch gearbeitet, aber ich denke, die oben ist ein besserer Weg, es zu tun:

@objc 
protocol MyProtocol { 

    var testAttribute: String { get set } 
} 

class MyEntity: NSManagedObject, MyProtocol { 

    @NSManaged var testAttribute: String 
} 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
     let myContext = appDelegate.managedObjectContext! 
     let entity: MyEntity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: myContext) as MyEntity 
     foo(entity) 
     println(entity.testAttribute) 
    } 

    func foo(var object: MyProtocol) { 
     object.testAttribute = "bar" 
    } 
} 
+3

Vielen Dank.Wenn ich die Erweiterung und NSManagedObject Klassencode zusammen in einer swift-Datei, zeigt es immer noch den gleichen Fehler.Aber wenn ich den Erweiterungscode in eine andere Datei verschieben.Es funktioniert gut.So seltsam – WeaponJ

+0

Ich benutze Xcode6. 1 Veröffentlichung Was ist mit dir 0 @ – WeaponJ

+1

@objc würde nicht funktionieren wegen CLLocationCoordinate2D. Was funktionierte, war einfach mein Protokoll in die Erweiterungsklasse zu verschieben, die automatisch über CoreData generiert wurde - bevor ich es in der Klasse hatte (was auch automatisch generiert wird) – DogCoffee

Verwandte Themen