Swift中的可选动态属性

blo*_*ilk 7 objective-c ios swift

我正在尝试编译以下Swift类:

class Waypoint: NSObject {
    dynamic var coordinate: CLLocationCoordinate2D?
}
Run Code Online (Sandbox Code Playgroud)

但是我得到以下编译器错误:

属性不能标记为动态,因为其类型无法在Objective-C中表示

如果我改为coordinate非可选,一切正常.我认为这是有道理的,因为Objective-C没有可选项的概念.有没有已知的解决方案或解决方法?

Jea*_*let 13

在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?
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,你找不到一个更通用的解决方案,它有一个结构的通用对象包装类,因为Objective-C没有泛型...另一种方法是使用这里描述的NSValue对象类型,但我怀疑它会是更优雅.