【问题标题】:Bridge Swift 4 enum to Objective C将 Swift 4 枚举桥接到 Objective C
【发布时间】:2017-10-06 12:35:13
【问题描述】:

编辑:我向你们所有人道歉,这一直是我的错——即使在 Swift 3 中也是不可能的。我很困惑自己。抱歉这个问题。

显然,在 Swift 4 中不再可能将枚举值数组桥接到 Objective C,甚至无法使用 @objc 注释:

@objc open func removeCacheAfterDelay(_ delay: Double, forType types: [CacheManagerType]) {
}

@objc public enum CacheManagerType: Int, RawRepresentable {
    case credit
    case debit
    case transactionHistory
}

removeCacheAfterDelay函数显示以下错误:

方法不能被标记为@objc,因为参数2的类型 无法在 Objective-C 中表示

我错过了什么吗?有什么解决办法吗?

【问题讨论】:

  • 问题是数组,而不是枚举。
  • 谢谢马特,但有什么办法让它工作吗?即使使用此数组桥接到 ObjC 时,此方法在 Swift 3 中也可以正常工作...
  • 我认为这是因为 Swift 3 中桥接的性质不同。
  • 那么这是否意味着它不再在 Swift 4 中工作了?一些解决方法呢?在我的应用程序中,我有很多桥接到 ObjC 的 swift 枚举数组...
  • 使它们成为[Int] 数组并将枚举映射到它们的原始值。之所以有效,是因为 Ints 映射到 NSNumber,它是一个对象。

标签: objective-c swift enums


【解决方案1】:

你必须像 Objective-C 一样思考。这个声明在翻译成 Objective-C 时可能意味着什么?特别是,[CacheManagerType] 是什么意思?它必须是一个数组,即一个 NSArray,包含 CacheManagerType 对象。

但那是不可能的。 CacheManagerType 是一个枚举。桥接到 Objective-C 的 Int 枚举变成了 Objective-C 枚举。为了让您的方法声明在 Objective-C 中工作,Objective-C 需要能够理解枚举数组的概念——而事实并非如此。在 Objective-C 中,枚举不是对象,但 NSArray 只能保存对象。

【讨论】:

  • "但那是不可能的"-但根据 OP,它在 Swift 3 中有效。查看您对[Int] 的问题的评论在 Swift 4 中有效,但在这里您可以写“在Objective-C,Int 不是对象,但 NSArray 只能保存对象”。因此,您的回答与您的评论不一致,并且显然否认了 Swift 3 的现实......也许整理一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多