Swift中如何通过PubNub发布类型为Any的字典格式数据?
问题原因
PubNub Swift版SDK的publish方法要求传入的message参数必须遵循JSONCodable协议。你当前使用的[String: Any]类型字典中,值的类型是Any(协议类型),无法遵循协议,因此编译器抛出错误。
解决方案
方案1:使用Codable结构体(推荐)
将需要传递的参数封装为遵循Codable协议的结构体,类型安全且不需要额外处理序列化,是最推荐的实现方式。
// 定义参数结构体,自动遵守Codable协议 struct BroadcastParams: Codable { let isContinous: Bool let pressure: Int let reset: Bool let StrokeWidth: Double } // 初始化参数 let params = BroadcastParams( isContinous: true, pressure: 1, reset: true, StrokeWidth: 11.0 ) // 直接传入结构体即可 pubnub.publish(channel: "ch:broadcastPoints", message: params) { result in switch result { case let .success(response): print("Successful Publish Response: \(response)") case let .failure(error): print("Failed Publish Response: \(error.localizedDescription)") } }
方案2:动态字典转AnyJSON
如果业务场景必须使用动态的[String: Any]字典,可以先将字典序列化为JSON数据,再转成PubNub内置的AnyJSON类型(该类型原生遵循JSONCodable协议)。
var params = [String : Any]() params["isContinous"] = true params["pressure"] = 1 params["reset"] = true params["StrokeWidth"] = 11.0 do { // 先将字典序列化为JSON Data let jsonData = try JSONSerialization.data(withJSONObject: params) // 反序列化为AnyJSON类型 let jsonMessage = try JSONDecoder().decode(AnyJSON.self, from: jsonData) // 发布消息 pubnub.publish(channel: "ch:broadcastPoints", message: jsonMessage) { result in switch result { case let .success(response): print("Successful Publish Response: \(response)") case let .failure(error): print("Failed Publish Response: \(error.localizedDescription)") } } } catch { print("字典序列化失败:\(error.localizedDescription)") }
注意:使用动态字典时需要保证所有值都是合法的JSON类型(布尔、整数、浮点数、字符串、数组、字典,空值需要用
NSNull表示),否则序列化会失败。
内容的提问来源于stack exchange,提问作者user10469417
相关产品推荐
相关产品推荐

