“如果让”不在Swift 4.0中展开可选值

时间:2017-10-05 10:50:59

标签: swift optional

我正在 Swift 4 中实施 CoreML ,这是我现在面临的if let问题,

    var pixelBuffer : CVPixelBuffer?
    var model: Inceptionv3?

    if let prediction = try? self.model?.prediction(image: pixelBuffer!)
    {
        classifier.text = "I think this is a \(String(describing: prediction.classLabel))." //ERROR..!!!
    }
  

可选类型'Inceptionv3Output?'的值没有打开;你是否   意思是用'!'还是'?'?

我知道错误的含义以及解决方法。我不明白为什么会出现?

在上面的代码中,我使用if let来获取展开的prediction值。它仍然要求我明确地解开它。

2 个答案:

答案 0 :(得分:4)

简答:

由于可选链接try?的结合,您正在创建一个双重包装的可选项。因此,if let只展开第一层双重包装的可选项,为您留下可选变量。

为什么会这样?

try?用于抛出的调用。如果调用确实抛出错误,则表达式返回nil。如果调用成功,则该值将包含在可选

您正在使用可选链来呼叫prediction上的model。如果模型为nil,则可选链的结果为nil。请注意,此结果并未抛出,因此结果将被try?包含在可选中,从而导致Optional(nil)不同为nil。如果对预测的调用成功,则结果将包含在可选中,因为可选链,并再次包装在可选中,因为try?

所以有三种可能的结果:

  1. 模型不是nil,调用prediction会返回类型Inceptionv3Output的有效结果,而不会抛出。由于Inceptionv3Output?,因此可选链Inceptionv3Output??,此结果变为try?
  2. 模型不是nil,但对prediction的调用会引发错误。由于throw,try?的结果为nil
  3. 型号为nil可选链的结果为nil,由于try ?导致Optional(nil),该结果再次包含在可选
  4. 因此,您的if let正在展开Inceptionv3Output??类型的值,这意味着prediction的类型为Inceptionv3Output?。如果呼叫没有抛出,if let会成功。如果modelnil,则prediction将为nil,否则它包含prediction model调用const { Bar, Data: { Selectors } } = require('some-module'); 的结果值1}}。

答案 1 :(得分:0)

尝试以这种方式展开:

if  let model = model,
    let prediction = try? model.prediction(image:pixelBuffer!) {
    // Your code here
}

您不能将try?与不throw的表达式一起使用。因此,您只是为了确保表达式model而被迫解开throws

如果modelnil,则表达式不会执行prediction(image:),这就是您在使用model之前解开try?的原因{1}}