Swift 中的可选类型错误:致命错误:在展开可选值时意外发现 nil

Posted

技术标签:

【中文标题】Swift 中的可选类型错误:致命错误:在展开可选值时意外发现 nil【英文标题】:Optional type error in Swift: fatal error: unexpectedly found nil while unwrapping an Optional value 【发布时间】: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]?'没有名为“生成器”的成员。 【参考方案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("--------------------------")
            

        

    )

【讨论】:

以上是关于Swift 中的可选类型错误:致命错误:在展开可选值时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift 错误致命错误:在展开可选值时意外发现 nil

SWIFT 致命错误:在展开可选值 (lldb) 时意外发现 nil

Swift:致命错误:在展开可选值时意外发现 nil

swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称

Swift Xcode 致命错误:在隐式展开可选值时意外发现 nil [重复]

Swift 错误 - 致命错误:在展开可选值时意外发现 nil [重复]