无法将属性标记为@objc,因为其类型无法在Objective-C中表示

时间:2018-09-20 05:43:43

标签: objective-c swift tuples

我正在完成一个用Swift编写的项目的移植,以支持Objective-C。编写了很多项目来支持Objective-C,但不支持特定类的属性。

这是属性:

open var remainingTime: ( hours: Int, minutes: Int, seconds: Int)?

我猜我不能只添加@objc,因为“ hours”,“ minutes”,“ seconds”是对象。如何使此属性对我的Objective-C项目可见?

2 个答案:

答案 0 :(得分:4)

您可以创建一个表示元组的类。

代码:

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?

答案 1 :(得分:0)

当我尝试通过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不兼容的属性。