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



我正在完成一个用 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 不兼容的属性。

相关内容

最新更新