标签中的Swift可选

时间:2015-08-11 10:39:32

标签: swift optional

我这里有这个代码

let fundsreceived = String(stringInterpolationSegment: self.campaign?["CurrentFunds"]!)
cell.FundsReceivedLabel.text = "$\(funds received)"

正在打印Optional(1000)

我已将!添加到变量中,但可选项不会消失。知道我在这里做错了什么吗?

2 个答案:

答案 0 :(得分:6)

发生这种情况是因为您要传递的参数

String(stringInterpolationSegment:)

可选

  

是的,你做了force unwrap,但仍然有Optional ...

事实上,如果你分解你的线......

let fundsreceived = String(stringInterpolationSegment: self.campaign?["CurrentFunds"]!)

进入以下等效声明......

let value = self.campaign?["CurrentFunds"]! // value is an Optional, this is the origin of your problem
let fundsreceived = String(stringInterpolationSegment: value)

您发现valueOptional

为什么?

  1. 由于self.campaign? 生成 Optional
  2. 然后["CurrentFunds"] 生成另一个Optional
  3. 最后,您的部队unwrap 移除一个Optional
  4.   

    所以 2个选项 - 1可选 = 1可选

    首先我能找到的最丑陋的解决方案

    我写这个解决方案只是为了告诉你应该做什么。

    let fundsreceived = String(stringInterpolationSegment: self.campaign!["CurrentFunds"]!)
    

    正如您所看到的,我用强制解包?替换了您的条件展开!。只是不要在家里做!

    现在是好的解决方案

    请记住,你应该每次都避免这个人!

    if let
        campaign = self.campaign,
        currentFunds = campaign["CurrentFunds"] {
            cell.FundsReceivedLabel.text = String(stringInterpolationSegment:currentFunds)
    }
    
    1. 我们正在使用conditional binding将可选的self.campaign转换为non optional常量(如果可能)。
    2. 然后我们正在将campaign["CurrentFunds"]的值转换为non optional type(如果可能)。
    3. 最后,如果IF成功,我们可以安全地使用currentFunds,因为它不是可选的。

      希望这有帮助。

答案 1 :(得分:2)

以这种方式用if let打开它:

if let fundsreceived = String(stringInterpolationSegment: self.campaign?["CurrentFunds"]!){
    cell.FundsReceivedLabel.text = "$\(fundsreceived)"
}

看看这个简单的例子:

let abc:String = "AnyString"  //here abc is not an optional

if let cde = abc {           //So you will get error here  Bound value in a conditional binding must be of optional type 
    println(cde)
}

但是如果你把它声明为可选的那样:

let abc:String? = "AnyString"

现在你可以解开它而不会出现这样的错误:

if let cde = abc {
    println(cde)    //AnyString
}

希望这个例子有所帮助。