2014-11-29 19 views
7

Tôi cần một giao diện được chia sẻ cho NSManagedObject và NSObject thông thường. Trong Objective-c, tôi có thể sử dụng một giao thức để đạt được điều đó. Nhưng trong Swift tôi nhận được lỗi thời gian chạy này. Bất kì giải pháp nào? Cảm ơn trước!NSManagedObject Không thể tuân theo giao thức trong 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 

}

Lỗi: Không xác định những biểu tượng cho kiến ​​trúc i386: "__TFC11YellowPages5Stockg2spSS", tham chiếu từ: __TFC11YellowPages5Stockm2spSS trong Stock.o "__TFC11YellowPages5Stockg4codeSS", tham chiếu từ: __TFC11YellowPages5Stockm4codeSS trong Stock.o ld: không tìm thấy (các) biểu tượng cho kiến ​​trúc i386 clang: lỗi: lệnh liên kết không thành công h mã thoát 1 (sử dụng -v để xem lời gọi)

+1

Các bạn đã thử thêm @objc để đầu của giao thức của bạn? –

+0

Tôi vừa thử điều này nhưng nó vẫn không hoạt động. @ DanielT. – WeaponJ

Trả lời

6

Điều này phù hợp với tôi. Hãy thử nó cho chính mình và xem nếu nó hoạt động:

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

dưới đây cũng làm việc, nhưng tôi nghĩ rằng ở trên là một cách tốt hơn để làm điều đó:

@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

Cảm ơn rất nhiều.Khi tôi đặt phần mở rộng và mã lớp NSManagedObject cùng nhau trong một tệp nhanh chóng, nó vẫn hiển thị cùng một lỗi. Nhưng nếu tôi di chuyển mã mở rộng sang tệp khác. Nó hoạt động tốt.So lạ – WeaponJ

+0

Tôi sử dụng Xcode6. 1 bản phát hành. Điều gì về u – WeaponJ

+1

@objc sẽ không làm việc cho tôi do CLLocationCoordinate2D. Điều gì đã làm việc đơn giản là chuyển giao thức của tôi sang lớp mở rộng được tạo tự động qua CoreData - trước khi tôi có nó trong lớp (cũng được tạo tự động) – DogCoffee

Các vấn đề liên quan