Как развернуть необязательное значение из NSDictionary? - Свифт

Я пытаюсь развернуть эти значения Int, которые я получаю от сервера, но все, что я пробовал, просто не работает. Он продолжает печатать:

«Необязательный (целое значение)».

var playerId, roomId : Int!

func makeGetRequest(path: String){
    let urlPath: String = "http://myServer.ddns.net:7878/\(path)"
    let url: NSURL = NSURL(string: urlPath)!
    var request1: URLRequest = URLRequest(url: url as URL)

    request1.httpMethod = "GET"
    let queue:OperationQueue = OperationQueue()

    NSURLConnection.sendAsynchronousRequest(request1 as URLRequest, queue: queue, completionHandler:{ (response: URLResponse?, data: Data?, error: Error?) -> Void in

        do {
            let jsonData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! NSDictionary
            print("ASynchronous\(jsonData)")

            self.playerId = jsonData.value(forKey: "playerId") as! Int
            self.roomId = jsonData.value(forKey: "roomId") as! Int

           print("\(self.roomId)   \(self.playerId)")

        } catch let error as NSError {
            print(error.localizedDescription)
        }

    })
}

введите здесь описание изображения


person Sorin    schedule 11.03.2017    source источник
comment
если пусть переменная = ...   -  person El Tomato    schedule 11.03.2017
comment
это не работает, оно все еще печатает Необязательный(1)   -  person Sorin    schedule 11.03.2017
comment
Вам нужно вернуться к книгам.   -  person El Tomato    schedule 11.03.2017
comment
Все эти ! - мои глаза! Останови это. Серьезно, вы знаете, что ваш код рухнет из-за неправильного использования оператора !, верно? Пожалуйста, потратьте некоторое время на изучение опций и безопасного развертывания в книге Swift.   -  person rmaddy    schedule 11.03.2017
comment
Ничто другое не сработало, я просто скопировал и вставил эту последнюю попытку, и да, я знаю, что это совсем нехорошо. если пусть a = jsonData.value(forKey: roomId) как! Int это была предыдущая попытка   -  person Sorin    schedule 11.03.2017
comment
Что вы подразумеваете под «больше ничего не работает»? Когда? Ты сделал это вчера? Или два дня назад? У вас нет единственного оператора if, чтобы развернуть таинственную переменную, которая может иметь или не иметь значение.   -  person El Tomato    schedule 11.03.2017
comment
если пусть id = jsonData.object(forKey: playerId) как? Int{self.playerId = идентификатор}. Это не работает, например, ни с as! или jsonData.value(..)   -  person Sorin    schedule 11.03.2017
comment
Если вы нажмете опцию jsonData, что скажет Xcode? Если вы щелкнете по данным, что скажет Xcode?   -  person El Tomato    schedule 11.03.2017
comment
он говорит jsonData: NSDictionary   -  person Sorin    schedule 11.03.2017
comment
Спасибо - я только что нашел ответ на ваш вопрос...   -  person Ripa Saha    schedule 17.03.2019


Ответы (2)


Вот как печатаются опции. Если вы этого не хотите, вам нужно развернуть их перед печатью. Имейте в виду, что комментарии к вашему вопросу действительны, а знак "!" почти наверняка разобьет вас в какой-то момент. Но для краткости можно сделать так:

print("\(self.roomId!)   \(self.playerId!)")
person ghostatron    schedule 11.03.2017
comment
Большое спасибо! Это было исправление, которое мне было нужно, теперь я могу использовать эти значения :) - person Sorin; 11.03.2017
comment
Это плохая идея. Это приведет к сбою, если эти значения не установлены. Ответ партии намного лучше, чем шлепать !. - person rmaddy; 11.03.2017
comment
Итак, вы минусуете меня, потому что не согласны с тем, что по-прежнему является правильным решением. И вы также в основном повторили именно то, что я сказал в своем ответе. Спасибо. И, по крайней мере, я объясняю, ПОЧЕМУ он видит то, что видит. - person ghostatron; 12.03.2017

Избегайте прямого использования !, потому что если значение равно nil и вы попытаетесь получить к нему доступ, это приведет к сбою приложения. Поэтому лучший способ сделать это — использовать операторы if let или guard let. Например, проверьте ниже:

self.playerId = jsonData.value(forKey: "playerId") as! Int
self.roomId = jsonData.value(forKey: "roomId") as! Int

if let safePlayerID = self.playerId, let saferoomID = self.roomId {
     print("\(safePlayerID)   \(saferoomID)")
}

Использование охранного разрешения:

guard let safePlayerID = self.playerId, let saferoomID = self.roomId else {
      return nil
}

print("\(safePlayerID)   \(saferoomID)")
person Parth Adroja    schedule 11.03.2017