2014-11-29 26 views
7

'daki protokole uyumuyor NSManagedObject ve normal NSObject için paylaşılan bir arabirime ihtiyacım var. Objective-c'de bunu elde etmek için bir protokol kullanabilirdim. Ama Swift'de bu çalışma zamanı hatasını aldım. Herhangi bir çözüm? Şimdiden teşekkürler! içinde __TFC11YellowPages5Stockm4codeSS: başvurulan Stock.o "__TFC11YellowPages5Stockg4codeSS" in __TFC11YellowPages5Stockm2spSS: başvurulan "__TFC11YellowPages5Stockg2spSS",:NSManagedObject 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 

}

Hata: mimari i386 için Tanımsız semboller Stok .0 ld: mimari için bulunamadı sembol (ler) i386 clang: error: linker komutu başarısız oldu h çıkış kodu 1 (çağırma görmek için -v kullanın)

+1

Eğer başlangıcına @objc ekleyerek denediniz protokolünüzün –

+0

Sadece bunu denedim ama hala çalışmıyor. @ DanielT. – WeaponJ

cevap

6

Bu benim için çalıştı. Kendiniz deneyin ve görün eğer çalışırsa:

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" 
    } 
} 

da çalıştı altında, ancak yukarıda bunu yapmak için daha iyi bir yolu olduğunu düşünüyorum:

@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

Çok teşekkürler. Uzatma ve NSManagedObject sınıf kodunu birlikte hızlı bir dosyaya koyduğumda, yine de aynı hatayı gösteriyor.Ama uzantı kodunu başka bir dosyaya taşırsam.Ben iyi çalışıyor.So garip – WeaponJ

+0

Xcode6 kullanıyorum. 1 sürüm. Ne zaman – WeaponJ

+1

@objc CLLocationCoordinate2D nedeniyle benim için çalışmaz. Çalışmamın sadece protokomu CoreData üzerinden otomatik olarak üretilen uzantı sınıfına taşıyordum - önce sınıfta (önce de otomatik olarak üretiliyor) – DogCoffee

İlgili konular