虽然使用" guard让#34;,"没有打开"错误

时间:2017-09-09 10:45:33

标签: swift

我有"可选类型“AnyObject?”的值未打开你是不是要使用!或?{" guard let tableauDeux = 错误

func attraperJSON() -> String? {

guard let krakenURL = NSURL(string: "https://api.kraken.com/0/public/Ticker?pair=XXBTZEUR") else {
    print("Probleme adresse")
    return nil
}
guard let tickerData = NSData(contentsOfURL: krakenURL) else {
    print("Problème ticker data")
    return nil
}
do {
    let json = try NSJSONSerialization.JSONObjectWithData(tickerData, options: [])
    guard let tableauUn = json["result"] else {return nil }
    guard let tableauDeux = tableauUn["XXBTZEUR"] else { return nil}
    let prix = tableauDeux["o"]
    return prix
    } catch {
    return nil
}
}

我不知道为什么警卫让我不能工作,谢谢! P.S:我知道它快速2而不是3,但我还在使用xcode 7

3 个答案:

答案 0 :(得分:1)

概述:

  • 编译错误消息指出类型错误
  • 正如@David所说,尝试尽可能多地使用原生类型,并且只在绝对必要时才使用NS对应

代码:

以下代码位于Swift 3的{​​{1}}。如果您使用的是旧版本,请进行必要的更改。

Xcode 8

答案 1 :(得分:1)

正如评论中已经建议的那样,我认为你需要在这里明确你的类型。我知道编译器不要求你这样做,但我发现它有助于我的思考,并避免编译器混淆,如果我总是完全明确。记住在你的情况下,函数需要返回一个String,而不是AnyObject,所以你需要确保你有一个String。所以我的函数版本(我对类型做了一些假设,但希望你得到的要点)如下:

func attraperJSON() -> String? {

    guard let krakenURL : NSURL = NSURL(string: "https://api.kraken.com/0/public/.   Ticker?pair=XXBTZEUR") else {
        print("Probleme adresse")
        return nil
}

guard let tickerData ; NSData = NSData(contentsOfURL: krakenURL) else {
        print("Problème ticker data")
        return nil
}

do {
        if let json : [String : AnyObject] = try NSJSONSerialization.JSONObjectWithData(tickerData, options: []) as? [String : AnyObject] {
            guard let tableauUn : [String : AnyObject] = json["result"] as? [String : AnyObject] else { return nil }
            guard let tableauDeux : [String : String] = tableauUn["XXBTZEUR"] as? [String : String] else { return nil }
            let prix : String = tableauDeux["o"]
            return prix
    } catch let retrievalError {

        print("Error in \(#function): \(retrievalError.localizedDescription)")
        // please put error handling code here
        return nil
    }
}

希望有所帮助。

答案 2 :(得分:0)

您必须选择将所有词典向下转换为正确的类型

guard let json = try NSJSONSerialization.JSONObjectWithData(tickerData, options: []) as? [String:AnyObject] else { return nil }
guard let tableauUn = json["result"] as? [String:AnyObject] else {return nil }
guard let tableauDeux = tableauUn["XXBTZEUR"] as? [String:AnyObject] else { return nil}

和最终值

let prix = tableauDeux["o"] as? String
相关问题