我这里有这个代码
let fundsreceived = String(stringInterpolationSegment: self.campaign?["CurrentFunds"]!)
cell.FundsReceivedLabel.text = "$\(funds received)"
正在打印Optional(1000)
我已将!
添加到变量中,但可选项不会消失。知道我在这里做错了什么吗?
答案 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)
您发现value
是Optional
!
self.campaign?
生成 Optional
["CurrentFunds"]
生成另一个Optional
unwrap
移除一个Optional
所以 2个选项 - 1可选 = 1可选
我写这个解决方案只是为了告诉你应该不做什么。
let fundsreceived = String(stringInterpolationSegment: self.campaign!["CurrentFunds"]!)
正如您所看到的,我用强制解包?
替换了您的条件展开!
。只是不要在家里做!
请记住,你应该每次都避免这个人!
!
if let
campaign = self.campaign,
currentFunds = campaign["CurrentFunds"] {
cell.FundsReceivedLabel.text = String(stringInterpolationSegment:currentFunds)
}
conditional binding
将可选的self.campaign
转换为non optional
常量(如果可能)。campaign["CurrentFunds"]
的值转换为non optional type
(如果可能)。最后,如果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
}
希望这个例子有所帮助。