ios - Swift 中的可选动态属性

标签 ios objective-c swift

我正在尝试编译以下 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 中使用它,你不能分配 nilCLLocationCoordinate2D 类型的变量.这就是您收到此错误的原因。

至于(丑陋的)解决方法,您可以包装 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/

相关文章:

swift - watchOS 2 上的最大内存使用量?

ios - 观察属性内部属性的变化

ios - 如何实现像 iBooks 中使用的那样的导航栏?

ios - 当 UIViewController 在启动期间设置为 UIWindow 的根时,不会调用 viewWillAppear 和后续生命周期事件

iphone - 苹果通知 token 开启关闭

iphone - 将 2D NSMutableArray 转换为 JSON 格式 - JSONKit

Swift - 添加在两个文本字段中捕获的值

objective-c - 在UIPickerView选择数组之前,按字母顺序对数组进行排序

ios - 为iOS项目中的每个目标选择不同的语言

ios - 如何通过应用程序从设备的照片库中删除照片?