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

PromiseKit NSDictionary未知类型转换问题求助

解决Swift 4升级后的JSON解析异常问题

看起来你在从Swift 2升级到Swift 4后,遇到了JSON解析和Promise类型适配的问题,这很常见——Swift 4引入了更严格的类型检查和原生的Codable协议,同时Objective-C桥接类型(比如NSDictionary)的使用方式也有了变化。我来帮你一步步修复这个问题:

核心问题分析

  1. 类型不匹配:Swift 4更推荐使用原生的[String: Any]字典类型,而非NSDictionary,泛型Promise中混用Objective-C类型容易引发类型转换异常。
  2. JSON解析方式过时:原来的try json.get("player_updates")可能依赖于Swift 2时代的扩展方法,在Swift 4中要么适配类型,要么改用更安全的原生解析方式。

解决方案1:改用Swift原生字典类型(快速修复)

把代码中的NSDictionary替换为Swift原生的[String: Any],同时调整类型转换逻辑:

class func getPlayerStatuses(sportName: String) -> Promise<[[String: Any]]> {
    let path = "api/sports/player-status/\(sportName)/"
    return API.get(path).then { (json: [String: Any]) -> [[String: Any]] in
        // 安全地解析player_updates数组,避免强制转换崩溃
        guard let playerUpdates = json["player_updates"] as? [[String: Any]] else {
            throw NSError(domain: "PlayerStatusError", code: -1, userInfo: [
                NSLocalizedDescriptionKey: "Failed to parse player updates from response"
            ])
        }
        return playerUpdates
    }
}

解决方案2:使用Codable实现类型安全解析(推荐)

Swift 4的Codable协议是处理JSON的最佳实践,能彻底避免类型转换的隐患。首先定义对应JSON结构的模型:

// 根据你的JSON结构定义属性,示例如下
struct PlayerUpdate: Codable {
    let playerId: String
    let status: String
    let lastUpdated: Date
    // 其他需要的属性...
}

然后修改你的网络请求函数,直接解析为模型数组:

class func getPlayerStatuses(sportName: String) -> Promise<[PlayerUpdate]> {
    let path = "api/sports/player-status/\(sportName)/"
    return API.get(path).then { responseData in
        // 假设API.get返回的是Data类型,如果是已解析的JSON,需调整为先转Data
        let decoder = JSONDecoder()
        // 如果JSON中的日期格式特殊,可以自定义解码策略
        decoder.dateDecodingStrategy = .iso8601
        return try decoder.decode([PlayerUpdate].self, from: responseData)
    }
}

为什么这样改?

  • 原生[String: Any]比NSDictionary更符合Swift的类型系统,减少桥接开销和潜在的类型错误。
  • Codable让JSON解析代码更清晰、安全,编译器会帮你检查属性匹配,运行时崩溃概率更低。
  • Swift 4及以后的版本对Objective-C类型的泛型支持更严格,避免混用能减少很多隐蔽的异常。

内容的提问来源于stack exchange,提问作者Konrad Wright

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:10:50