【问题标题】:Optional dynamic properties in SwiftSwift 中的可选动态属性
【发布时间】:2015-03-13 08:28:16
【问题描述】:

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

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

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

属性不能被标记为动态,因为它的类型不能在 Objective-C 中表示

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

【问题讨论】:

  • 我不确定您要做什么。您可能想要该物业的观察员?出于什么目的(只是为了知道属性何时更改)? 也许我可以给你推荐一个替代方案。
  • @lchamp 正确,我想要一个观察者来与 ReactiveCocoa 集成

标签: ios objective-c swift


【解决方案1】:

在 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 没有泛型,因为 Objective-C 没有泛型对象包装类。但我怀疑它会更优雅。

【讨论】:

  • 感谢您的快速回答。我想我会按照你的建议创建自己的 Coordinate 类并给它一个 toCLLocationCoordinate2D 方法,除非有更优雅的方式来支持它的类型转换,例如:coordinate as CLLocationCoordinate2D
猜你喜欢
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多