我试图编译以下Swift类:
class Waypoint: NSObject {
dynamic var coordinate: CLLocationCoordinate2D?
}
但是我得到以下编译器错误:
属性无法标记为动态,因为其类型无法在Objective-C
中表示
如果我将coordinate
更改为非可选项,则一切正常。我认为这是有道理的,因为Objective-C没有可选项的概念。有没有已知的解决方案或解决方法?
答案 0 :(得分:12)
在Objective-C中,您可以使用nil
来表示缺少值,但仅限于对象类型。 Swift使用Optional
泛型类型对此进行概括(并使其类型安全):您可以拥有Optional<NSObject>
,又称NSObject?
,但您也可以拥有Int?
或CLLocationCoordinate2D?
。
但CLLocationCoordinate2D
是一个结构 - 如果您在Objective-C中使用它,则无法将nil
分配给CLLocationCoordinate2D
类型的变量。这就是您收到此错误的原因。
对于(丑陋的)解决方法,您可以将CLLocationCoordinate2D
包装在对象中:
class CLLocationCoordinate2DObj: NSObject {
let val: CLLocationCoordinate2D
init(_ val: CLLocationCoordinate2D) {
self.val = val
}
}
class Waypoint: NSObject {
dynamic var coordinate: CLLocationCoordinate2DObj?
}
不幸的是,你不能找到一个更通用的解决方案,它有一个结构的通用对象包装类,因为Objective-C没有泛型...另一种方法是使用NSValue
作为对象输入described here,但我怀疑它会更优雅。