请求完成处理程序致命错误:在展开可选值异常时意外发现 nil
Posted
技术标签:
【中文标题】请求完成处理程序致命错误:在展开可选值异常时意外发现 nil【英文标题】:Request completion handler fatal error: unexpectedly found nil while unwrapping an optional value exception 【发布时间】:2018-03-02 12:35:02 【问题描述】:我已经在我的 ios 应用中实现了应用内购买。这里我使用了RequestCompletionHandler
SKProductsRequestDelegate
方法,如下所示。有时应用程序会因为 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
的可能性并尝试执行它。如果completionHandler
是nil
,它会崩溃。除非您可以 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