Objective-C中的Swift枚举关联值

5
  1. 有没有办法在Objective-C中使用带有关联值的Swift3枚举?
  2. 如果我开发了一个库想要给Swift3用户提供方便的API,有没有一种声明/桥接Swift3枚举带有关联值的方式在Objective-C中使用?
2个回答

8
很抱歉,这是不可能的。苹果有一个名为“Swift类型兼容性”的列表,明确排除了在Swift中定义的没有Int原始值类型的枚举。 参考

2
你能列出一些可能的替代方案吗? - khunshan

4
这是我所做的事情:
在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)
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接