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.
Nguồn
2015-03-13 08:59:53
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
đúng, tôi muốn một người quan sát để hội nhập với ReactiveCocoa – bloudermilk