2015-03-13 16 views
6

Tôi đang cố gắng để biên dịch lớp Swift sau:tính năng động bắt buộc trong Swift

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2D? 
} 

Nhưng tôi nhận được lỗi biên dịch sau:

Property cannot be marked dynamic because its type cannot be represented in Objective-C

Nếu tôi thay đổi coordinate là không bắt buộc mọi thứ hoạt động tốt. Tôi cho rằng điều này có ý nghĩa, vì Objective-C không có khái niệm về các tùy chọn. Có giải pháp hoặc giải pháp nào đã biết không?

+0

Tôi không chắc bạn đang cố gắng làm gì. Bạn có thể muốn một người quan sát về tài sản đó? Vì mục đích gì (chỉ cần biết khi nào tài sản thay đổi)? _Maybe tôi sẽ có thể đề nghị bạn một @lchamp alternative._ – lchamp

+0

đúng, tôi muốn một người quan sát để hội nhập với ReactiveCocoa – bloudermilk

Trả lời

11

Trong Objective-C, bạn có thể sử dụng nil để báo hiệu sự vắng mặt của giá trị, nhưng chỉ trên các loại đối tượng. Swift tổng quát điều này (và làm cho kiểu này an toàn) với loại chung loại Optional: bạn có thể có một Optional<NSObject>, a.k.a. NSObject?, nhưng bạn cũng có thể có Int? hoặc CLLocationCoordinate2D?.

Nhưng CLLocationCoordinate2D là cấu trúc - nếu bạn sử dụng nó trong Mục tiêu-C, bạn không thể chỉ định nil cho biến loại CLLocationCoordinate2D. Đây là lý do tại sao bạn nhận được lỗi này.

Đối với một (xấu xí) khắc phục, bạn có thể quấn CLLocationCoordinate2D trong một đối tượng:

class CLLocationCoordinate2DObj: NSObject { 
    let val: CLLocationCoordinate2D 
    init(_ val: CLLocationCoordinate2D) { 
     self.val = val 
    } 
} 

class Waypoint: NSObject { 
    dynamic var coordinate: CLLocationCoordinate2DObj? 
} 

Thật không may, bạn không thể tìm thấy một giải pháp tổng quát hơn với một đối tượng lớp wrapper chung cho cấu trúc, như Objective- C không có Generics ... Một thay thế sẽ được sử dụng NSValue như loại đối tượng như described here, nhưng tôi nghi ngờ rằng nó sẽ là tao nhã hơn.

+0

Cảm ơn câu trả lời nhanh. Tôi nghĩ rằng tôi sẽ tạo ra lớp 'Coordinate' của riêng mình khi bạn đề nghị và cho nó một phương thức' toCLLocationCoordinate2D' trừ khi có cách tao nhã hơn để hỗ trợ việc soạn thảo nó như: 'coordinate as CLLocationCoordinate2D' – bloudermilk

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