swift3 Как удалить Необязательный

это мой код:

 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

Более того, я попытался таким образом развернуть «идентификатор пользователя». Однако это не работает

let unwrappedUserID = [userID]

print (unwrappedUserID)

Спасибо вам, ребята


person Ding    schedule 20.04.2017    source источник
comment
Ваш код распаковки неверен.   -  person JAL    schedule 20.04.2017
comment
Пожалуйста, обратитесь за помощью по этой ссылке. stackoverflow.com/a/51356716/8334818   -  person Pramod More    schedule 16.07.2018


Ответы (2)


Наилучший метод проверки и распаковки 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 должна выйти из области видимости.

person m_callens    schedule 20.04.2017

Попробуйте это, let unwrappedUserID = userID!

person f_qi    schedule 20.04.2017
comment
Плохая практика — неявно разворачивать необязательные параметры без проверки значения nil или ошибок. - person m_callens; 20.04.2017
comment
истинный. Я показываю OP только необязательный формат развертывания. nil и проверка ошибок входит в его практику кодирования. - person f_qi; 20.04.2017