【问题标题】:Property cannot be marked @objc because its type cannot be represented in Objective-C属性不能标记为@objc,因为它的类型不能在 Objective-C 中表示
【发布时间】:2019-02-24 08:44:46
【问题描述】:

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

这是属性:

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

我猜我不能只添加@objc,因为“小时”、“分钟”、“秒”是对象。如何使这个属性对我的 Objective-C 项目可见?

【问题讨论】:

  • Objective-C 中没有元组类型。您需要使用其他类型(可能是类)才能将其导出到 Objective-C。

标签: objective-c swift tuples


【解决方案1】:

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

代码:

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?

【讨论】:

  • 最好添加@objcMembers 来制作一个需要从Objective-C代码访问的类。
  • @OOPer:~如果它是一个已经暴露给 Objective-C 的 NSObject 子类,那就不行了~
【解决方案2】:

当我尝试通过 KVO 观察 Enum 时,项目中出现此错误。我的枚举看起来像这样:

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)!
    })
    

就这样。现在,每次您更改 observable 类中的 _enumName 时,observable 类上的相应实例也会立即更新。

这当然是一个过于简单的实现,但它应该让您了解如何观察 KVO 不兼容的属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多