如何对已经强行下架的属性进行nil检查[重复]。

问题描述 投票:-1回答:2

我有一个简单的问题,但找不到合适的解决方案。我有一个Swift代码,看起来像这样。

 let id  = dic["id"] as! String

我需要检查是否 dic["id"] 是零。我可以像这样检查是否为nil

if let safeId = dic["id"]{
   let id = safeId as! String
}

但问题是我有很多值要解包,对每个属性都做上述步骤似乎不切实际。我希望有像下面这样的方法,但它不起作用,因为downcasting总是返回一个值,所以它不是可选的,因此不能被解包。

if let snap = child as! DataSnapshot,
            let dic = snap.value as! [String : Any],
            let firstName =  dic["first_name"] as! String,
            let lastName = dic["last_name"] as! String,
            let image = dic["user_image"] as! String,
            let id  = dic["id"] as! String{
                  /* My code */
             }

这个方法给出了一个错误,叫做 条件绑定的初始化器必须具有 Optional 类型,而不是 'String' 。 我不是高级开发人员,请帮我解决这个问题。

ios swift optional
2个回答
3
投票

替换所有 !?, if let 拆包 选项

if let snap = child as? DataSnapshot,
   let dic = snap.value as? [String : Any],
   let firstName =  dic["first_name"] as? String,
   let lastName = dic["last_name"] as? String,
   let image = dic["user_image"] as? String,
   let id  = dic["id"] as? String{
          /* My code */
   }

您的 我可以检查是否为零 例子也是不好的做法。它应该是

if let safeId = dic["id"] as? String {
   let id = safeId
}

请阅读(本节 选项 在)的 语言指南


2
投票

你应该在这里做可选的铸造,如果你是强行铸造,那就没有必要把它放在一个 if let 块。

if let snap = child as? DataSnapshot,
            let dic = snap.value as? [String : Any],
            let firstName =  dic["first_name"] as? String,
            let lastName = dic["last_name"] as? String,
            let image = dic["user_image"] as? String,
            let id  = dic["id"] as? String{
                  /* My code */
             }
© www.soinside.com 2019 - 2024. All rights reserved.