Ios Alamofire在展开可选值时意外发现nil

Ios Alamofire在展开可选值时意外发现nil,ios,swift,alamofire,Ios,Swift,Alamofire,我使用这个Alamofire代码下载URL的图像 func getImage(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) { makeGetImageCall(imageUrlString, completionHandler: completionHandler) } func makeGetImageCall(

我使用这个Alamofire代码下载URL的图像

func getImage(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) {
        makeGetImageCall(imageUrlString, completionHandler: completionHandler)
    }

    func makeGetImageCall(imageUrlString: String, completionHandler: (responseObject: UIImage?, error: NSError?) -> ()) {
        //Perform request
        print("Trying to get: " + imageUrlString)
        Alamofire.request(.GET, imageUrlString, headers: ["Authorization": NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!])
            .responseImage { request, response, result in
                print(request)
                print(response)
                print(result)
                completionHandler(responseObject: result.value, error: nil)
        }
    }
这是我使用以下方法的类:

public class NewsListEntry: NSObject {
    public var thumbnail: String = ""
    public var thumbnailImage: UIImage = UIImage()
    public var thumbnailDownloaded: Bool = false


    public func downloadThumbnail() {
        print(self.title)
        GetImageHandeler().getImage(self.thumbnail, completionHandler: { (responseObject, error) in
        })
    }
}
然后我得到一个:

fatal error: unexpectedly found nil while unwrapping an Optional value
我做错了什么

这是我得到的错误:

我做错了什么

两件事。首先,您正在某处使用“力展开”操作符,可能在此处:

NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!
这意味着您要保证返回值不是
nil
,但在本例中,它是。因为你违背了诺言,应用程序崩溃了


其次,请不要将授权字符串存储在NSUSERDEFAULTS中。iOS拥有高度安全的钥匙链是有原因的<代码>NSUserDefaults不提供加密。请用钥匙链。有像and这样的包装库可以帮助您。

您在不检查结果是否有效的情况下展开结果。添加以下代码:

Alamofire.request(.GET, imageUrlString, headers: ["Authorization": NSUserDefaults.standardUserDefaults().stringForKey("BasicAuthenticationString")!])
    .responseImage { request, response, result in
        print(request)
        print(response)
        print(result)
        switch result {
        case .Success(let value):
            completionHandler(responseObject: value, error: nil)
        case .Failure(_, let error):
            completionHandler(responseObject: nil, error: error)
        }
}

如果使用Swift 2,您需要将
completionHandler
块的
error
参数从
NSError?
更改为
ErrorType

NSUserDefaults.standardUserDefaults().stringForKey(“基本验证字符串”)
可能是
nil
。添加了一个打印,它不是nil。它适用于6个图像,然后我得到了错误,当我得到错误时,URL是有效的。这是我看到强制展开的代码的唯一部分,因此它必须是nil才能给出此特定错误消息。除非这个错误发生在我们在这个问题中没有看到的另一行代码上?在这种情况下,请用所有相关的代码和信息编辑您的问题。我已经为错误添加了两个屏幕截图,我不知道如何在代码中看到错误发生的位置?我为BasicAuthenticationString添加了打印,它永远不会为零。所以这一定是其他原因,但我看不出我在使用任何其他强制展开。我为错误添加了两个屏幕截图,我不知道如何查看代码中发生错误的位置?设置异常断点以查看错误发生的位置:我得到的exc_breakpoint code=1与提供的屏幕截图中的相同,即使有异常断点。@LordVermillion可能
imageUrlString
无效。你可以发布日志跟踪吗?字符串是有效的,如果我把它放在浏览器中,我会得到图像。