"如果让"尽管价值为零,但仍然执行了

时间:2015-05-21 15:11:09

标签: swift optional

我有一个"如果让"正在执行的声明,尽管" 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?的结果,而这并非如此。

4 个答案:

答案 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)

Swift 2.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 {}