【问题标题】:Optional type error in Swift: fatal error: unexpectedly found nil while unwrapping an Optional valueSwift 中的可选类型错误:致命错误:在展开可选值时意外发现 nil
【发布时间】:2015-07-13 03:49:02
【问题描述】:

我正在尝试使用 FBSDK v4.x 从 facebook 获取相册。我在下面使用此代码,打印出来后得到 json 格式的结果,但之后会导致如下错误:'fatal error: unexpectedly found nil while unwrapping an Optional value' on code in这一行:let graphData = result.valueForKey("data") as! [FBSDKShareAPI] .so 谁能帮我解决这个错误。提前致谢。

func fetchAlbum(){
    print(FBSDKAccessToken.currentAccessToken())
    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me?fields=albums", parameters: nil);
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
        if let gotError = error{
            print(gotError.description);
        }
        else{
            print("fetched data: \(result)")
            if result != nil{ 
            let graphData = result.valueForKey("data") as! [FBSDKShareAPI]  
            var albums:[AlbumModel] =  [AlbumModel]();
            for obj:FBSDKShareAPI in graphData{
                let desc = obj.description;
                println(desc);
                let name = obj.valueForKey("name") as! String;
                println(name);
                if(name == "ETC"){
                    let test="";
                }
                let id = obj.valueForKey("id") as! String;
                var cover = "";
                if let existsCoverPhoto : AnyObject = obj.valueForKey("cover_photo"){
                    let coverLink = existsCoverPhoto as! String;
                    cover = "/\(coverLink)/photos";
                }
                //println(coverLink);
                let link = "/\(id)/photos";
                let model = AlbumModel(name: name, link: link, cover:cover);
                albums.append(model);
                }
            NSNotificationCenter.defaultCenter().postNotificationName("albumNotification", object: nil, userInfo: ["data":albums]);

            }
        }

    })
}

【问题讨论】:

  • 尝试使用as? 可能,看起来您正在尝试强制转换为 nil 的值
  • result 可能不是 nil,但 result.valueForKey("data") 可能是 nil,并且您通过打开它得到错误,即 as! (带感叹号)
  • 这对我们有好处吗?但它会导致这一行出现一些问题:' for obj:FBSDKShareAPI in graphData{ ' 像这样:'[FBSDKShareAPI]?'没有名为“生成器”的成员。

标签: ios swift


【解决方案1】:

更好的是,你可以去

if let graphData = result?.valueForKey("data") as? [FBSDKShareAPI] {
    //bla
}

它应该为你做所有的 nil 检查

【讨论】:

  • 使用valueForKey() 可能是一种不好的形式。我认为最好确定 result 是什么类型的对象,这样您就可以安全地改用 result["data"]
  • 我试了一下,它根本不执行大括号内的代码块。有什么想法吗?
  • @aaron,我实际上同意,只是在反刍代码。 @sarayakchak 这意味着结果要么为零,要么无法将 valueForKey("data") 转换为 FBSDKShareAPI 类型。我建议你放一个断点,看看里面的结果对象是什么样子的
  • @sarayakchak 是不是因为 result["data"] 是 nil?在if 子句上方放置一个断点并检查result dict 的内容。
  • 那么我应该使用什么来代替使用 FBSDKShareAPI?在 FBSDK v 3.x 中我使用 FBGraphObject,但在 FBSDK v4.x 中我不知道。有什么可以代替的吗?
【解决方案2】:

这样可以正常工作:

    func fetchAlbum(){
    print(FBSDKAccessToken.currentAccessToken())
    let graphRequest: FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me/albums", parameters: nil);
    graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
        if let gotError = error{
            print(gotError.description);
        }
        else{
            let graphData: NSArray! = (result?["data"])! as? NSArray
            if (graphData != nil){

                var albums:[AlbumModel] =  [AlbumModel]();
                var obj: NSArray?
                for obj in graphData{
                let desc = obj.description;
                let name = obj.valueForKey("name") as! String;
                if(name == "ETC"){
                    let test="";
                }
                let id = obj.valueForKey("id") as! String;
                var cover = "";
                if let existsCoverPhoto : AnyObject = obj.valueForKey("cover_photo"){
                    let coverLink = existsCoverPhoto as! String;
                    cover = "/\(coverLink)/photos";
                }
                let link = "/\(id)/photos";
                let model = AlbumModel(name: name, link: link, cover:cover);
                albums.append(model);
                }
            NSNotificationCenter.defaultCenter().postNotificationName("albumNotification", object: nil, userInfo: ["data":albums]);

                }else{
                    print("--------------------------")
            }

        }

    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多