繁体   English   中英

在委托方法中使用枚举作为字典键

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM