Невозможно принудительно развернуть значение не необязательного типа, но печатает с «необязательным» - PullRequest
1 голос
/ 18 января 2020

Прежде всего, прежде чем кто-либо разместит дерзкий пост с «двойным вопросом». Я прошел КАЖДЫЙ сингл в стеке, а затем некоторые. Подобные посты либо не применимы, либо не работают для меня.

Справочная информация:

Я пытаюсь создать приложение для связи с веб-сайтом (сервер в будущем, один шаг в время.) Я установил связь и проверил, что она работает. Короче говоря, данные, поступающие при печати, имеют перед собой «опционально».

Мой веб-сайт очень скудный и состоит из файлов html и js. js связан с моей html командой <"script">. Я пытаюсь использовать JSON-код в swift, но появляется сообщение об ошибке «not valid JSON». Когда я продолжаю расследование, я получаю ранее упомянутый «необязательный» в моих данных. Я пытался использовать "!" принудительно распаковать мои входящие данные, но мне выдается сообщение "не удается принудительно развернуть значение не необязательного типа" ??? Когда я пробую свой быстрый код на известном JSON веб-сайте (что-то, что я нашел на youtube), он работает нормально.

Очевидно, мой вопрос не является исключительно «принудительным развёртыванием». Предоставленное решение может изменить то, что необходимо для исправления этого ie. изменить то, что вопрос "должен был быть". Я открыт для любых решений, но, может быть, мы просто начнем с того, как я могу принудительно развернуть это?

Заранее спасибо.

XCODE (Swift)

super.viewDidLoad()

let url = URL(string: "https://*****for my eyes only*****.com/script.js")!              

var request = URLRequest(url: url)
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
request.httpMethod = "POST"


let task = URLSession.shared.dataTask(with: request) { data, response, error in
     guard let data = data,
     let response = response as? HTTPURLResponse,
     error == nil else 
           {                                           
              print("error", error ?? "Unknown error")
                       return
           }

     guard (200 ... 299) ~= response.statusCode else 
           {               
              print("statusCode should be 2xx, but is \(response.statusCode)")
              print("response = \(response)")
                       return
           }


//shows data printed w/ optional in front of data                   
let htmlcontent = NSString(data: data, encoding: String.Encoding.utf8.rawValue)

print(htmlcontent)


//data is the portion I am trying to force unwrap 
//currently produces error "not valid JSON"      
let decoder = JSONDecoder()
let classes = try! decoder.decode([Class].self, from: data)

HTML Код

<html>
<body>
  <script src="script.js"></script>
</body>
</html>

JS Код (взято из inte rnet - не мой)

{
    "mothmap": {
        "value": [
            {
                "longitude": -0.13025200000004133,
                "latitude": 51.4596619
            },
            {
                "longitude": -2.707384100000013,
                "latitude": 53.7613383
            }
        ]
    }
}

1 Ответ

1 голос
/ 18 января 2020

В сообщении об ошибке указано:

Ожидается декодирование массива, но вместо этого найден словарь.

Это правда. Ваш JSON не является массивом, но вы передали тип массива [Class] декодеру. Вам необходимо сопоставить тип с JSON.

Попробуйте

let classes = try! decoder.decode(Class.self, from: data)

Или отредактируйте JSON, чтобы поместить класс в []

[{
    "mothmap": {
        "value": [
            {
                "longitude": -0.13025200000004133,
                "latitude": 51.4596619
            },
            {
                "longitude": -2.707384100000013,
                "latitude": 53.7613383
            }
        ]
    }
}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...