【问题标题】:Get data from function that returns Any从返回 Any 的函数中获取数据
【发布时间】:2019-11-27 09:23:18
【问题描述】:

您好,我是 swift 新手,这给我带来了一些问题。 我有一个来自 SDK 的函数,它返回 Any 结果,这就是实际数据的样子:

/*{
    code = 1;
    msg = success;
    result =     {
        macAddress = "E6:1D:4D:71:64:9B";
    };
}*/

我想出了一个方法来获取我需要的数据,但看起来很复杂。

sucBlock: {
    (mac) in
        if let macAddress = ((mac as AnyObject)["result"] as AnyObject )["macAddress"] as! Optional<String>{
                print("macAddress:" + macAddress)
            }
    }

有没有更好的方法来实现这个结果?我试图创建一个struct 并输入这个对象,但不知何故它总是失败。

【问题讨论】:

    标签: ios swift casting


    【解决方案1】:

    在这种情况下你需要避免使用AnyObjectas!

    if let macAddress = mac as? [String:Any] , let item =  macAddress["result"] as? [String:String] , let str = item["macAddress"] {
        print("str:" + str)
    }
    

    如果你需要一个结构(不要认为它真的值得你的简单 json)

    do { 
        let data = try JSONSerialization.data(withJSONObject:mac)
        let res = try JSONDecoder().decode(Root.self, from:data)
        print(res.result.macAddress)
    }
    catch { 
        print(error)
    }
    

    struct Root: Codable {
        let code: Int
        let msg: String
        let result: Result
    }
    
    // MARK: - Result
    struct Result: Codable {
        let macAddress: String
    }
    

    【讨论】:

    • 如果回答解释问题和解决方案,而不是只发布代码,则对问题的作者和未来的读者更有帮助。
    • 我认为它总是值得一个结构,因为你避免了用键钻研字典的所有麻烦,并且你可以免费解码
    • 谢谢。很好的解释
    • 我尝试了结构示例,但它失败了:“解码失败数据无法读取,因为它的格式不正确。”。我可以看到 macAddress 看起来像一个字符串,但是“msg”参数呢,它只是说没有引号的成功。
    猜你喜欢
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多