【发布时间】:2016-10-19 11:17:18
【问题描述】:
- 有没有办法在 Objective-C 中使用具有关联值的新 Swift3 枚举?
- 如果我开发一个库并希望为 Swift3 用户提供方便的 API,是否有办法在 Objective-C 中声明/桥接 Swift3 枚举与相关值?
【问题讨论】:
标签: objective-c swift enums swift3
【问题讨论】:
标签: objective-c swift enums swift3
恐怕这是不可能的,Apple 有一个 Swift 类型兼容性 列表,其中明确排除了在没有 Int 原始值类型的情况下在 Swift 中定义的枚举。
【讨论】:
这就是我所做的:
在 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)
}
}
【讨论】: