将AnyObject转换为[MyEnum:String]字典

时间:2015-03-19 14:01:05

标签: swift dictionary casting

我将枚举定义为:

enum AlertInterfaceControllerKey {
    case Title
    case Content
}

我想在呈现WKInterfaceController时将其用作上下文,例如:

let alertData = [AlertInterfaceControllerKey.Title: "Title",
                 AlertInterfaceControllerKey.Content: "Content"]
presentControllerWithName("AlertInterfaceController", context: alertData)

而且,在AlertInterfaceController

override func awakeWithContext(context: AnyObject?) {
    if let alertData = context as? [AlertInterfaceControllerKey: String] {
        let title = data[AlertInterfaceControllerKey.Title]
        let content = data[AlertInterfaceControllerKey.Content]
        // ...
    }
}

此处的错误是(在if let行上):

 Type '[AlertInterfaceControllerKey : String]' does not conform to protocol 'AnyObject'

非常感谢任何帮助 - 甚至更好的方法来处理这个问题。

1 个答案:

答案 0 :(得分:1)

不幸的是,Swift枚举值不是NSObject,因此您不能将它们用作NSDictionaries中的键。它们可以是Swift词典中的键,但是它们不会被转换为NSDictionary,因此错误。

您可以为枚举提供类型并存储原始值:

enum AlertInterfaceControllerKey: String {
  case Title = "TitleKey"
  case Content = "ContentKey"
}

let alertData: AnyObject = [AlertInterfaceControllerKey.Title.rawValue: "Title"]

不是那么优雅,但会让你在API中弥合Swift和Objective-C类型之间的差距。这个解决方案实际上只是定义一些字符串常量的更好方法。