【问题标题】:Swift Alamofire - fatal error: unexpectedly found nil while unwrapping an Optional value - youtube api: PlaylistItems: listSwift Alamofire - 致命错误:在展开可选值时意外发现 nil - youtube api: PlaylistItems: list
【发布时间】:2015-12-29 10:19:30
【问题描述】:

这是我的代码:断点在。 videoObj.videoThumbnailUrl =

我设置了一个断点。 arrayOfVideos.append(videoObj)。在放置(lldb)的底部选项卡上。我输入:“po videoObj.videoThumbnailUrl”,同时在 .append 处有一个断点。 它与网址一起返回。但是当我将断点放在 videoObj.videoThumbnailUrl 上时。并输入:“po videoObj.videoThumbnailUrl”它返回空引号“” 我正在尝试使用 sn-p 方法从 youtubev3api-playlist 接收数据。提取具有 key 方法值的数据。

我从 . “sn-p.thumbnails.maxres”并尝试运行它,但出现此错误:无法将类型“__NSCFDictionary”(0x105c4eef0)的值转换为“NSString”(0x10603fb20)。

for video in JSON["items"] as! NSArray {

 let videoObj = Video()

 videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as! String

 videoObj.videoTitle = video.valueForKeyPath("snippet.title") as! String

 videoObj.videoDescription = video.valueForKeyPath("snippet.description") as! String

 videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as! String

                arrayOfVideos.append(videoObj)
            }

【问题讨论】:

    标签: swift youtube-api fatal-error alamofire


    【解决方案1】:

    不要使用强制转换或强制解包,因为如果遇到 nil 值,它们会导致您的应用程序崩溃。就像你的情况一样。而是使用optional bindingsoptional chaining 来检测和处理nil 值。

    if let items = JSON["items"] as? NSArray {
        for video in items {
            let videoObj = Video()            
            videoObj.videoId = video.valueForKeyPath("snippet.resourceId.videoId") as? String            
            videoObj.videoTitle = video.valueForKeyPath("snippet.title") as? String            
            videoObj.videoDescription = video.valueForKeyPath("snippet.description") as? String            
            videoObj.videoThumbnailUrl = video.valueForKeyPath("snippet.thumbnails.maxres.url") as? String            
            arrayOfVideos.append(videoObj)
        }
    }
    

    请注意,此代码不再使用强制转换,因此如果 Youtube API 不发送某些字段,那么我们将只为这些字段提供 nil 值,而不是崩溃。

    我们也将conditionally castNSArray 与条件绑定结合使用,如果它们实际上是一个数组,我们只会对它们进行循环。

    【讨论】:

    • 我替换了“!”和 ”?”并得到一个不同的错误。未解包的可选类型字符串的值:...
    • 这是一个业余错误。我用默认/中/高替换了maxres,它运行正常。没有错误。 :) 这是我的第一个项目,请原谅我的错误。谢谢大家!
    【解决方案2】:

    如果您在源代码上放置断点并且线程在您的断点处暂停,则意味着断点行尚未执行。

    当你的线程暂停时

    videoObj.videoThumbnailUrl = video.valueForKeyPath("sn-p.thumbnails.maxres.url") 为!字符串

    然后按step over。这会将您的线程移动到下方 1 行。

    你应该可以看到videoObj.videoThumbnailUrl的赋值

    【讨论】:

    • 好吧,我认为这可能是问题的迹象。仍然收到错误。致命错误:在展开可选值时意外发现 nil。当我运行项目时
    猜你喜欢
    • 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
    相关资源
    最近更新 更多