我有一个"如果让"正在执行的声明,尽管" let"部分是零。
if let leftInc : Double? = self.analysis.inputs[self.btnLeftIncisor.dictionaryKey!]! {
println(leftInc)
let valueString : String = formatter.stringFromNumber(NSNumber(double: leftInc!))!
self.leftIncisorTextField?.text = valueString
self.btnLeftIncisor.associatedLabel?.text = valueString
}
// self.analysis.inputs is a Dictionary<String, Double?>
输入词典保存用户输入的信息 - 数字,如果他们还没有在匹配字段中输入任何内容,则为零。
在Swift的早期版本中,代码编写如下:
if let leftInc : Double? = self.analysis.inputs[self.btnLeftIncisor.dictionaryKey!]?? {
并且工作正常。
我看到了一个类似的问题here,但在这个例子中,问题似乎是使用Any?
的结果,而这并非如此。
答案 0 :(得分:2)
if-let用于展开选项。您可以通过将类型设置为可选的Double来允许nil值。
if语句应为:
if let leftInc = self.analysis.inputs[self.btnLeftIncisor.dictionaryKey!] as? Double{
...
}
这将尝试从输入中获取一个对象,如果失败则返回nil并跳过它。如果确实返回了某些内容,它会尝试将其转换为Double。如果失败,它也会跳过if语句。
如果输入是[Something:Double]
之类的词典,那么您不需要最后as? Double
作为索引,字典将返回Double?
我建议阅读关于可选链接的快速书籍。
答案 1 :(得分:2)
在if let
中,您定义了另一个可选项,这就是nil
为合法案例的原因。 if let
主要用于提取(可能)来自可选的非可选值。
你可以试试:
if let leftInc : Double = self.analysis.inputs[self.btnLeftIncisor.dictionaryKey!].flatMap ({$0}) {
// leftInc is not an optional in this scope
...
}
无论如何,我考虑不要将其作为一个班轮,而是利用guard
案例。只是为了增强可读性。并避免使用bang运算符(!
)。
答案 2 :(得分:0)
你可以进一步分解 -
if let optionalDouble = self.analysis.inputs[self.btnLeftIncisor.dictionaryKey!], leftInc = optionalDouble {
....
}
因为你的字典有可选值 - 这种写作方式可能会让你更清楚地了解
答案 3 :(得分:0)
if let k = dict["someKey"]{}, dict["someKey"]
将是Any类型的对象
这可以绕过一个nill
所以做一个类型转换来使其正确,如if let k = dict["someKey"] as! String {}