我正在尝试编译以下 Swift 类:
class Waypoint: NSObject {
dynamic var coordinate: CLLocationCoordinate2D?
}
但我得到以下编译器错误:
Property cannot be marked dynamic because its type cannot be represented in Objective-C
如果我将 coordinate
更改为非可选的,则一切正常。我想这是有道理的,因为 Objective-C 没有可选项的概念。是否有任何已知的解决方案或解决方法?
最佳答案
在 Objective-C 中,您可以使用 nil
表示没有值(value),但仅限于对象类型。 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 ,但我怀疑它会更优雅。
关于ios - Swift 中的可选动态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29027741/