我有enum
声明。
enum OP_CODE {
case addition
case substraction
case multiplication
case division
}
并在方法中使用它:
func performOperation(operation: OP_CODE) {
}
我们都知道我们如何正常称呼
self.performOperation(OP_CODE.addition)
但是如果我必须在某个委托中调用它,其中整数值不可预测而不是如何调用它。
例如:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.delegate.performOperation(indexPath.row)
}
此处,编译器抛出错误Int is not convertible to 'OP_CODE'
。在这里尝试了许多排列。但无法弄清楚。
答案 0 :(得分:18)
您需要指定枚举的原始类型
enum OP_CODE: Int {
case addition, substraction, multiplication, division
}
addition
的原始值为0
,substraction
为1
,依此类推。
然后你可以做
if let code = OP_CODE(rawValue: indexPath.row) {
self.delegate.performOperation(code)
} else {
// invalid code
}
如果您使用的是较旧版本的swift,原始枚举的工作方式会有所不同。在Xcode< 6.1,你必须使用fromRaw()
而不是可用的初始化器:
let code = OP_CODE.fromRaw(indexPath.row)
答案 1 :(得分:8)
您可以在枚举中使用raw values:
enum OP_CODE : Int{
case addition = 0
case substraction = 1
case multiplication = 2
case division = 3
}
并使用可用的初始化程序将原始值作为输入:
let code = OP_CODE(rawValue: 2) // code == .multiplication
请注意,code
是可选的,因为如果原始值未映射到有效的枚举,则初始值设定项返回nil。
在你的情况下:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let code = OP_CODE(rawValue: indexPath.row)
if let code = code {
self.delegate.performOperation(code)
}
}
此外,给定枚举的实例,您可以使用rawValue
属性获取关联的原始值。
注意:在Xcode 6.1中枚举有所改变 - 如果您使用的是旧版本,请阅读@ GabrielePetronella的回答和相关评论。