[英]Use enum as dictionary key in delegate methods
我目前在 iOS 应用程序和 WatchOS 应用程序之间进行消息传递。 我正在使用硬编码的消息字符串作为密钥。 这行得通,但我想要几种类型的消息。 所以我做了一个字符串类型的枚举。
enum DeviceMessage: String {
case Foo, Bar
}
在一个视图中,我想调用 WCSession 使用我自己的方法发送消息:
func sendMessage(msg:[String : Any]){
if self.session.isReachable == false {
self.session.transferUserInfo(msg)
} else {
self.session.sendMessage(msg, replyHandler: nil){ error in
print(error.localizedDescription)
}
}
}
我希望能够使用,而不是字典键的字符串。 Foo
。 不使用RawValue
等。设置它的最佳方法是什么? 在这种情况下,我还想将传入消息的委托方法也设置为使用 DeviceMessage 作为键,这样我就可以在不使用硬编码字符串作为键的情况下对其进行评估。
func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:]) {
print(message)
DispatchQueue.main.async {
self.message = userInfo["message"] as? String ?? "Unknown"
}
}
我将其添加到枚举所在的文件中:
func DeviceMessageRawKey(key: DeviceMessage) -> String { return key.rawValue }
所以现在我可以使用 String 发送和接收(没有变化)但是当具体时,我可以使用枚举。
func session(_ session: WCSession, didReceiveMessage message: [String : Any]) {
DispatchQueue.main.async {
if let val = message[DeviceMessageRawKey(key: .Foo)] {
self.message = val as? String ?? "Unknown"
}
}
}
...
self.model.sendMessage(msg: [DeviceMessageRawKey(key: .Foo) : "Need data."])
某些东西成为字典键的唯一要求是它实现了Hashable
协议。 由于您的枚举具有String
类型的原始值,因此您可以让它符合协议而不实现任何东西。
enum DeviceMessage: String, Hashable {
case Foo, Bar
}
然后你可以这样做:
let dict: [DeviceMessage: Any] = [.Foo: "hello"]
您仍然需要在某处从[String: Any]
-> [DeviceManager: Any]
进行转换(反之亦然),但至少您可以在发送/接收消息的 class 之外仅使用[DeviceManager: Any]
。
您可以使用 String 枚举作为键来自由定义字典:
enum DeviceMessage: String {
case Foo, Bar
}
var aDict: [DeviceMessage: String]
aDict = [.Foo: "woof"]
那很好用。 但是,WatchKit 的sendMessage()
方法希望消息的类型为[String: Any]
。
您需要将[DeviceMessage: String]
字典转换为[String: Any]
字典以将其传递给sendMessage()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.