Swift中的可选动态属性

时间:2015-03-13 08:28:17

标签: ios objective-c swift

我试图编译以下Swift类:

class Waypoint: NSObject {
    dynamic var coordinate: CLLocationCoordinate2D?
}

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

  

属性无法标记为动态,因为其类型无法在Objective-C

中表示

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

1 个答案:

答案 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,但我怀疑它会更优雅。