我正在完成一个用 Swift 编写的项目的移植,以支持 Objective-C。许多项目都是为了支持Objective-C而编写的,而不是特定类的属性。
这是属性:
open var remainingTime: ( hours: Int, minutes: Int, seconds: Int)?
我猜我不能只添加@objc
,因为"小时","分钟","秒"是对象。如何使此属性对我的 Objective-C 项目可见?
您可以创建一个表示元组的类。
法典:
class Time: NSObject {
let hours: Int
let minutes: Int
let seconds: Int
init(hours: Int, minutes: Int, seconds: Int) {
self.hours = hours
self.minutes = minutes
self.seconds = seconds
}
}
@objc open var remainingTime: Time?
当我尝试通过 KVO 观察枚举时,项目中发生了此错误。我的枚举看起来像这样:
enum EnumName: String {
case one = "One"
case two = "Two"
}
如果您正在努力观察它,此解决方法有助于解决我的问题。
可观察类:
- 创建
@objc dynamic var observable: String?
像这样创建枚举实例:
private var _enumName: EnumName? { didSet { observable = _enumName!.rawValue } }
观察者类:
- 创建
private var _enumName: EnumName?
- 创建
private let _instance = ObservableClass()
创造
private var _enumObserver: NSKeyValueObservation = _instance.observe(.observable, options: .new, changeHandler: { [weak self] (_, value) in guard let newValue = value.newValue else { return } self?._enumName = EnumName(rawValue: period)! })
比它。现在,每次更改可观察类中的_enumName
时,观察类上的相应实例也将立即更新。
这当然是一个过于简化的实现,但它应该让你了解如何观察 KVO 不兼容的属性。