请求完成处理程序致命错误:在展开可选值异常时意外发现 nil

Posted

技术标签:

【中文标题】请求完成处理程序致命错误:在展开可选值异常时意外发现 nil【英文标题】:Request completion handler fatal error: unexpectedly found nil while unwrapping an optional value exception 【发布时间】:2018-03-02 12:35:02 【问题描述】:

我已经在我的 ios 应用中实现了应用内购买。这里我使用了RequestCompletionHandlerSKProductsRequestDelegate 方法,如下所示。有时应用程序会因为 nil 值而崩溃。我的代码有什么问题?

completionHandler 声明为:fileprivate var completionHandler: RequestCompletionHandler!

func productsRequest(_ request: SKProductsRequest!, didReceive response: SKProductsResponse!) 

print("Successfully loaded list of products..")
productsRequest = nil
    if response.products.count > 0 
        if let skProducts = response.products as? [SKProduct] 
            for product in skProducts 
                print("found product: \(product.productIdentifier), \(product.localizedTitle), \(product.price.floatValue)")
            
            completionHandler(true, skProducts as NSArray)  //unexpectedly found nil while unwrapping an optional value exception getting in this line
            completionHandler = nil
        
    

请参阅下面的屏幕截图以更好地理解:

【问题讨论】:

What does "fatal error: unexpectedly found nil while unwrapping an Optional value" mean?的可能重复 【参考方案1】:

如果完成处理程序可以是nil,我建议使用if let,或者在您的情况下使用可选方法调用:

completionHandler?(true, skProducts as NSArray)

由于您使用了隐式展开的可选(您在completionHandler 声明中使用了!),所以completionHandler(true, skProducts as NSArray) 行与completionHandler!(true, skProducts as NSArray) 相同,它忽略了completionHandler 可能是nil 的可能性并尝试执行它。如果completionHandlernil,它会崩溃。除非您可以 100% 确定它永远不会是 nil,否则永远不要使用隐式展开。

此外,我强烈建议不要将隐式展开的类型用作属性类型,除非您有充分的理由这样做。在这种情况下,completionHandler 显然可以是nil。而是将声明更改为可选:

fileprivate var completionHandler: RequestCompletionHandler?

【讨论】:

视情况而定。如果它是 nil 时它是一个错误,那很好,你会在运行时被告知。就像OP一样。现在,如果有人不知道 之间的区别?而且!,这很难。【参考方案2】:

您将 completionHandler 声明为 RequestCompletionHandler!

这意味着你是在告诉编译器:“completionHandler 可能是 nil,但我绝对百分百确定我每次使用它时都不是,所以如果我在它为 nil 时使用它,那么请给我一个支持并崩溃应用程序”。

这正是编译器正在做的事情。当它为零时,您不应该调用completionHandler。要么你忘记设置它,要么故意没有设置它(但这非常非常不可能),那么你需要检查它是否为 nil。

【讨论】:

以上是关于请求完成处理程序致命错误:在展开可选值异常时意外发现 nil的主要内容,如果未能解决你的问题,请参考以下文章

Swift-不断收到“致命错误:在展开可选值时意外发现 nil”

“致命错误:在展开可选值时意外发现 nil”,同时调用协议方法

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

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

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

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