swift3如何删除可选

时间:2017-04-20 17:27:21

标签: swift swift3 optional unwrap

这是我的代码:

 func uplouadPost() {

    // shortcut to data to be php

   let parseJSON = UserDefaults.standard.value(forKey: "parseJSON") as? 
   NSDictionary
   let userID = parseJSON!["userID"] as! String

...

  if error == nil {

            do {

                // json containes $returnArray from php
                let json = try JSONSerialization.jsonObject(with: data!, 
  options: .mutableContainers) as? NSDictionary

                print("========================\(userID)")      

打印我得========================可选(23)

但我不想要Optioanl

如何获得23

还有什么,我试图解开" userID"通过这种方式。然而,它没有工作

let unwrappedUserID = [userID]

print (unwrappedUserID)

谢谢你们

2 个答案:

答案 0 :(得分:0)

检查和解包Optionals的最佳方法是使用guard语句或if-let语句。

假设你有一个字典定义为:

let parseJson: [String: Any]? = ["userId": 23]

即使它有一个值,它仍然是Optional类型,所以要访问我们想要的字典中的值,我们需要检查它具有nil值的可能性,假设我们没有创建它并且知道它具有真正的价值。

使用if-let语句,我们可以:

if let json = parseJson {
  // WILL ONLY EXECUTE IF parseJson IS NOT nil
  // json is now of type [String: Any] instead of [String: Any]?
  let userId = json["userId"]
  print("=========\(userId)") // =========23
}

这将创建一个新范围,其中json常量现在包含{n}和未包装的parseJson可选值。在这种情况下,如果parseJson 等于nil,则if-let块内的代码将无法执行。

另一个选项是guard语句,它非常相似。

guard let json = parseJson else {
  // ONLY EXECUTES IF parseJson IS nil
  // MUST EXIT CURRENT SCOPE AS A RESULT
  return // or throw NSError()
}

let userId = json["userId"]
print("==========\(userId)") // ==========23

在这种情况下,guard之后的代码仅在parseJson为非零时才会执行,因为guard块的内部必须退出范围。

答案 1 :(得分:-2)

试试这个let unwrappedUserID = userID!