我正在尝试编译以下 Swift 类:
class Waypoint: NSObject {
dynamic var coordinate: CLLocationCoordinate2D?
}
但我收到以下编译器错误:
属性无法标记为动态,因为其类型无法在 Objective-C 中表示
如果我改变coordinate
作为非可选,一切都很好。我认为这是有道理的,因为 Objective-C 没有选项的概念。有任何已知的解决方案或解决方法吗?
在 Objective-C 中,你可以使用nil
表示没有值,但仅限于对象类型。 Swift 通过以下方式概括了这一点(并使其类型安全)Optional
通用类型:你可以有一个Optional<NSObject>
,又名NSObject?
,但你也可以有一个Int?
or a CLLocationCoordinate2D?
.
But 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
作为对象类型此处描述 https://stackoverflow.com/questions/5691881/how-to-wrap-a-struct-into-nsobject,但我怀疑它会更优雅。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)