我正在 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
值。它仍然要求我明确地解开它。
答案 0 :(得分:4)
简答:
由于可选链接与try?
的结合,您正在创建一个双重包装的可选项。因此,if let
只展开第一层双重包装的可选项,为您留下可选变量。
为什么会这样?
try?
用于抛出的调用。如果调用确实抛出错误,则表达式返回nil
。如果调用成功,则该值将包含在可选。
您正在使用可选链来呼叫prediction
上的model
。如果模型为nil
,则可选链的结果为nil
。请注意,此结果并未抛出,因此结果将被try?
包含在可选中,从而导致Optional(nil)
不同为nil
。如果对预测的调用成功,则结果将包含在可选中,因为可选链,并再次包装在可选中,因为try?
。
所以有三种可能的结果:
nil
,调用prediction
会返回类型Inceptionv3Output
的有效结果,而不会抛出。由于Inceptionv3Output?
,因此可选链和Inceptionv3Output??
,此结果变为try?
。nil
,但对prediction
的调用会引发错误。由于throw,try?
的结果为nil
。nil
。 可选链的结果为nil
,由于try ?
导致Optional(nil)
,该结果再次包含在可选中因此,您的if let
正在展开Inceptionv3Output??
类型的值,这意味着prediction
的类型为Inceptionv3Output?
。如果呼叫没有抛出,if let
会成功。如果model
为nil
,则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
。
如果model
为nil
,则表达式不会执行prediction(image:)
,这就是您在使用model
之前解开try?
的原因{1}}