快速正确处理零值

时间:2017-02-10 00:38:07

标签: swift swift3

阅读可选值我确信我的代码中涵盖了所有基础,但我仍然遇到了可怕的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没有显示关于此问题的警告或建议,因此这里的某人可能只有一个。

2 个答案:

答案 0 :(得分:3)

这里最好的方法是使用swift touch来检查值是否为零。

首先,在第二行中,您使用guards,在其他任何地方都没有引用它,它应该是subDict吗?

这里的事情是myDict中的演员可能会返回nil或者没有" count"在subDict中。因此,当你执行let myCount = subDict["count"] as? String时,Int(myCount!)的强制解包会抛出异常,因为它是零。

除非你100%确定价值不是零,否则你应该尽可能避免强行解开。在其他情况下,您应该使用变量的设置来检查它是否为零。

使用您的代码,使用guard的更新版本如下:

myCount

这更安全,因为如果守卫中的任何条件失败,那么它将文本设置为nil结束方法。

答案 1 :(得分:2)

首先将变量myCountString?)变量打包到名为countString)的变量。

let myCount = mainDict["count"] as? String

if let count = myCount {
   //..
}

然后尝试基于变量Int(String)创建count

由于您可以传递Int("Hi")Int("1"),因此可以返回零。

myTotal = Int(count)

然后,您将拥有一个名为myTotalInt?)的变量,其中包含您想要的结果。

代码

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)
  }

}

示例1

let data = [
  "start": [
    "count": "1"
  ]
]

myCountUpdate(mainDict: data) // outputs 1

示例2

let data1 = [
  "start": [
    "count": 1
  ]
]

myCountUpdate(mainDict: data1) // outputs 1