【问题标题】:swift3 How to remove Optional [duplicate]swift3如何删除可选的[重复]
【发布时间】:2017-04-20 17:27:21
【问题描述】:

这是我的代码:

 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)

谢谢大家

【问题讨论】:

标签: swift swift3 optional unwrap


【解决方案1】:

检查和解开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 常量现在包含非零且未包装的可选值 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 块的内部必须退出范围。

【讨论】:

    【解决方案2】:

    试试这个,let unwrappedUserID = userID!

    【讨论】:

    • 在未完成 nil 值或错误检查的情况下隐式解包选项是不好的做法
    • 真的。我只向 OP 展示了展开可选的格式。 nil 和错误检查是他的编码实践。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多