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 致命错误:在展开可选值 (lldb) 时意外发现 nil
swift 2 致命错误:在展开可选值时意外发现 nil - 类别名称