【问题标题】:Swift enum associated values in Objective-CObjective-C 中的 Swift 枚举关联值
【发布时间】:2016-10-19 11:17:18
【问题描述】:
  1. 有没有办法在 Objective-C 中使用具有关联值的新 Swift3 枚举?
  2. 如果我开发一个库并希望为 Swift3 用户提供方便的 API,是否有办法在 Objective-C 中声明/桥接 Swift3 枚举与相关值?

【问题讨论】:

    标签: objective-c swift enums swift3


    【解决方案1】:

    恐怕这是不可能的,Apple 有一个 Swift 类型兼容性 列表,其中明确排除了在没有 Int 原始值类型的情况下在 Swift 中定义的枚举。

    Reference

    【讨论】:

    • 你能列出一些可能的替代品吗?
    【解决方案2】:

    这就是我所做的:

    在 Swift 类中创建了枚举

    enum Origin {
        case Search(searchTerm: String, searchResultsPageNum: Int)
        case Discovery(pageNum: Int)
    }
    

    然后在我的类中,创建枚举属性和函数(对 Objective C 可见)来设置和获取枚举属性的值。

    @objc class GameSession: NSObject
    {
        ...
    
        var gameOrigin: Origin?
    
        ...
    
        let originStr = "origin"
        let notSpecified = "Not Specified"
    
        @objc func getOrigin() -> NSDictionary
        {
            guard let origin = gameOrigin else {
                return [originStr: notSpecified]
            }
    
            switch origin {
            case .Search(let searchTerm, let searchResultsPageNum):
                return ["searchTerm": searchTerm, "searchResultsPageNum": "\(searchResultsPageNum)"]
            case .Discovery(let pageNum)
                return ["pageNum": pageNum]
            default:
                return [originStr: notSpecified]
            }
        }
    
        @objc func setSearchOriginWith(searchTerm: String, searchResultsPageNum: Int, filtered:Bool)
        {
            self.gameOrigin = Origin.Search(searchTerm: searchTerm, searchResultsPageNum: searchResultsPageNum, filtered: filtered)
        }
    
        @objc func setDiscoveryOriginWith(pageNum: Int)
        {
            self.gameOrigin = Origin.Discovery(pageNum: pageNum)
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多