阅读可选值我确信我的代码中涵盖了所有基础,但我仍然遇到了可怕的func myCountUpdate(mainDict: [String : NSObject]) {
let myDict = mainDict["start"] as! [String : CFString]
let myCount = subDict["count"] as? String
let myTotal = Int(myCount)? // nope, it forces me to use non-optional !
// as the other thread suggest it's easy to check for nil with an optional int.
// how the hell can you do that if it won't allow you to make it optional?
if myTotal != nil {
print(myCount!)
let label: String = "\(myCount)"
text = label
} else {
text = nil
}
}
。
这是有道理的,因为我读过:What does “fatal error: unexpectedly found nil while unwrapping an Optional value” mean?。它建议使nil
可选,这就是我想要的:
Int
我已经尝试了很多东西,包括使用其他值来检查service
等等。问题是编译器不允许我将date
声明为非-optional,那么我的选择是什么? Xcode没有显示关于此问题的警告或建议,因此这里的某人可能只有一个。
答案 0 :(得分:3)
这里最好的方法是使用swift touch
来检查值是否为零。
首先,在第二行中,您使用guards
,在其他任何地方都没有引用它,它应该是subDict
吗?
这里的事情是myDict
中的演员可能会返回nil或者没有" count"在subDict中。因此,当你执行let myCount = subDict["count"] as? String
时,Int(myCount!)
的强制解包会抛出异常,因为它是零。
除非你100%确定价值不是零,否则你应该尽可能避免强行解开。在其他情况下,您应该使用变量的设置来检查它是否为零。
使用您的代码,使用guard的更新版本如下:
myCount
这更安全,因为如果守卫中的任何条件失败,那么它将文本设置为nil结束方法。
答案 1 :(得分:2)
首先将变量myCount
(String?
)变量打包到名为count
(String
)的变量。
let myCount = mainDict["count"] as? String
if let count = myCount {
//..
}
然后尝试基于变量Int
(String)创建count
。
由于您可以传递Int("Hi")
或Int("1")
,因此可以返回零。
myTotal = Int(count)
然后,您将拥有一个名为myTotal
(Int?
)的变量,其中包含您想要的结果。
func myCountUpdate(mainDict: [String : Any]) {
let myDict = mainDict["start"] as? [String : Any]
if let myCount = myDict?["count"] as? String {
if let myTotal = Int(myCount) {
print(myTotal)
}
}
if let myCount = myDict?["count"] as? Int {
print(myCount)
}
}
let data = [
"start": [
"count": "1"
]
]
myCountUpdate(mainDict: data) // outputs 1
let data1 = [
"start": [
"count": 1
]
]
myCountUpdate(mainDict: data1) // outputs 1