You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:36:01