ios - 从返回 String 或 Double 的 API 获取

标签 ios json swift api struct

我正在从一个 API 中获取数据,该 API 根据我获取的对象(此处为 price)返回一个 stringdouble

我之前在 API 解码 struct 中添加了一个 init,它允许通过将 string 转换为 double 来获取两者 如果需要:

struct CryptoCURRENCY : Decodable {

    let price : Double
    let percentChange24h : Double

    private enum CodingKeys : String, CodingKey {
        case price = "PRICE"
        case percentChange24h = "CHANGEPCT24HOUR"
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        percentChange24h = try container.decode(Double.self, forKey: .percentChange24h)
        do {
            price = try container.decode(Double.self, forKey: .price)
        } catch DecodingError.typeMismatch(_, _) {
            let stringValue = try container.decode(String.self, forKey: .price)
            price = Double(stringValue)!
        }
    }
}

我遇到了 API 问题,需要更改获取函数,现在不再考虑 init,任何以 string 返回的值都会被忽略。

如何修改以下代码以考虑 init 或执行将 string 转换为 double 的相同操作 如果需要的话可以保存吗?

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data, error == nil else {
            completion(nil, error ?? FetchError.unknownNetworkError)
            return
        }
        do {
            if let outerJSON = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
                if let cryptoJSON : [String: Any] = outerJSON["RAW"] as? [String : Any] {
                    if let currencyJSON : [String: Any] = cryptoJSON[cryptoSym] as? [String : Any] {
                        if let actualJSON : [String: Any] = currencyJSON[currency] as? [String : Any] {
                            if let price = actualJSON["PRICE"] as? Double {
                                cryptoDoublePrice = price
                                CryptoInfo.cryptoPriceDic[cryptoPrice] = cryptoDoublePrice
                            }
                            if let percent = actualJSON["CHANGEPCT24HOUR"] as? Double {
                                cryptoDoublePercent = percent
                                CryptoInfo.cryptoPercentDic[cryptoPercent] = cryptoDoublePercent
                            }
                        }
                    }
                }
            }
        } catch let parseError {
            completion(nil, parseError)
        }
    }

最佳答案

好吧,这是一个非常愚蠢的问题,我觉得在这里提问可以帮助我正确思考问题并更轻松地找到答案,不过,我可能会强制自己在写完问题后等待 10 分钟再提交哈哈。

我只是做了:

if let price = actualJSON["PRICE"] as? Double {
    cryptoDoublePrice = price
    CryptoInfo.cryptoPriceDic[cryptoPrice] = cryptoDoublePrice
}
if let price = actualJSON["PRICE"] as? String {
    cryptoDoublePrice = Double(price)!
    CryptoInfo.cryptoPriceDic[cryptoPrice] = cryptoDoublePrice
}

我可能会做一些更好优化的事情。

关于ios - 从返回 String 或 Double 的 API 获取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49195759/

相关文章:

python - 使用 Appengine 用 python 解码 JSON

iphone - IOS 8 - 方向更改后,导航栏被状态栏遮挡

ios - UISwipeGestureRecognizer 动画

iOS - 如何使 UICollectionViewCell 根据其内容调整其高度? (包含一个 UITableView)

ios - 注册 Darwin 通知并通过回调发送事件详细信息 - 代号一

ios - 我的 NSMutableArray 中的意外大括号

ios - 在 iphone 5 ios 7 上一次又一次创建数据库

json - 使用 VBA 函数从 API 调用中提取结果

android - 无法从 START_OBJECT token 中读取 JSON : Can not deserialize instance of java. lang.String(非常简单的对象)

swift - 如何在 Parse 中构建两个用户之间的相互关系?