首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Optional获取值(Optional(<__NSSingleObjectArrayI>(25)

如何从Optional获取值(Optional(<__NSSingleObjectArrayI>(25)
EN

Stack Overflow用户
提问于 2021-05-21 05:18:21
回答 1查看 79关注 0票数 0

我想知道“价格”键的值是"25“。

我从后端得到了Json的回复

代码语言:javascript
复制
{
  "errorCode": 0,
  "message": "Request successfully served.",
  "data": {
    "games": {
      "TWELVEBYTWENTYFOUR": {
        "jackpot_amount": "KES 40,000.00",
        "draw_date": "2021-05-21 10:59:45",
        "extra": {
          "jackpotAmount": 40000,
          "unitCostJson": [
            {
              "currency": "KES",
              "price": 25
            }
          ]
        },
      }
    },
    "currentTime": {
      "date": "2021-05-20 22:28:18.738038"
    }
  }
}

这是我到目前为止的代码:

代码语言:javascript
复制
fetchData { (dict, error) in

    let playerLoginInfo = dataDict["data"] as? NSDictionary
    let playerGameInfo = playerLoginInfo?.value(forKey: "games") as? NSDictionary
    
    if let TWELVEBYTWENTYFOUR = playerGameInfo?.value(forKey: "TWELVEBYTWENTYFOUR") as? NSDictionary {

            let extra = TWELVEBYTWENTYFOUR.value(forKey: "extra") as? NSDictionary
            let unitCostJson = extra?.value(forKey: "unitCostJson") as? NSArray
            print("price")
            print(unitCostJson?.value(forKey: "price") as? Any)

    }
}

我知道这是控制台:

代码语言:javascript
复制
Optional(Optional(<__NSSingleObjectArrayI 0x600001f091d0>(
25
)
))

我已经看过这个问题了,但我想不出一个解决方案

编辑:

我现在已经使用Codeable来获取数据:

代码语言:javascript
复制
struct Resp: Codable {
    let errorCode: Int
    let message: String
    let data: Dat
}
struct Dat: Codable {
    let games: Games
    let currentTime: CurrentTime
}

struct Games: Codable {
    let game_code: String
    let datetime: String
    let estimated_jackpot: String
    let guaranteed_jackpot: String
    let jackpot_title: String
    let jackpot_amount: String
    let draw_date: String
    let extra: Extra
    let next_draw_date: String
    let active: String
}
struct Extra: Codable {
    let currentDrawNumber: Int
    let currentDrawFreezeDate: String
    let currentDrawStopTime: String
    let jackpotAmount: Int
    let unitCostJson: [UnitCostJson]
}
struct UnitCostJson: Codable {
    let currency: String
    let price: Int
}

struct CurrentTime: Codable {
    let date: String
    let timezone_type: Int
    let timezone: String
}

我现在正在尝试使用下面的代码从价格中获取值

代码语言:javascript
复制
    do{
        let resp:Resp = try JSONDecoder().decode(Resp.self , from:data);
        let data = resp.data
        let games = data.games
        let extra = games.extra
        let unitCostJson = extra.unitCostJson
        print(unitCostJson[0].price) 
    }
    catch{
        GlobalFunctions.shared.callOnMainThread {
            self.showAlert(Message: "Something went wrong. Please retry.")
        }
    }

它正在进入catch,现在我应该如何在unitCostJson上获取内部数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-21 15:38:50

我删除了你的结构并删除了所有不相关的属性(与json相比),如果你想重新添加它们,你需要使用一个CodingKey枚举

代码语言:javascript
复制
struct Resp: Codable {
    let errorCode: Int
    let message: String
    let data: Dat
}
struct Dat: Codable {
    let games: [String:Games]
    let currentTime: CurrentTime
}

struct Games: Codable {
    let extra: Extra
}
struct Extra: Codable {

    let unitCostJson: [UnitCostJson]
}
struct UnitCostJson: Codable {
    let currency: String
    let price: Int
}

struct CurrentTime: Codable {
    let date: String
}

现在您可以像这样访问unitCost

代码语言:javascript
复制
let unitCost = resp.data.games["TWELVEBYTWENTYFOUR"]?.extra.unitCostJson
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67628062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档