Приведение из Любого к чему-либо еще не удается - PullRequest
0 голосов
/ 08 мая 2018

API возвращает мне переменную типа Any. Это выглядит так, когда я его печатаю.

{
  "sender" : "Kira",
  "created" : "08.05.2018",
  "text" : "Cncncm"
}

Я пытался использовать SwiftyJSON, чтобы разыграть его следующим образом let mydata = JSON(data), но он не работает. Я пытался использовать технику декодирования Swift 4, но и это не удалось. Я пытался сделать это let myData = data as? Dictionary<String, String>, но снова не удалось.

Я не знаю, что здесь делать. Любые советы или решения?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Наконец-то появилась возможность продемонстрировать один из Codable протоколов скрытых гемов. Пожалуйста, запустите следующее на игровой площадке:

import Cocoa

let jsonData = """
    {
      "sender" : "Kira",
      "created" : "08.05.2018",
      "text" : "Cncncm"
    }
    """.data(using: .utf8)!

struct SenderText: Codable {
    let sender: String
    let created: Date
    let text: String
}

let dayFormatter = DateFormatter()
dayFormatter.dateFormat = "dd.MM.yyyy"
let date = dayFormatter.date(from:"08.05.2018")
let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .formatted(dayFormatter)

do {
    let sendText = try decoder.decode(SenderText.self, from: jsonData)
    print(sendText)
} catch {
    print(error)
}

Простая элегантность того, как легко определить такой сложный синтаксический анализатор, отображающий грязную JSON-строку в ваш любимый struct, вряд ли когда-нибудь перестанет удивлять меня. Независимо от того, как странно выглядит ваш формат даты, он не более чем на 3 строки от анализа в процессе.

Есть что-то, касающееся приведения типов, которое вы должны заметить: в Swift, как и в большинстве объектно-ориентированных языков, вы можете * приводить что-то к чему-то другому, если (и только если) это уже что-то еще в первую очередь (но это знание где-то было потеряно). Поскольку ваш String "просто" String (возможно, замаскированный Any), вы не сможете наложить на что-либо еще. Однако протокол Codable предоставляет вам потрясающие средства для decode из Strings Data с удивительной легкостью. Этот процесс не следует путать с актерами, даже если он выглядит практически одинаково. Это создание и инициализация другого, более подходящего по структуре объекта из простого куска Data, который вы, вероятно, получили от своего обычного веб-сервиса.

Отлично, по крайней мере, в моей книге.

0 голосов
/ 08 мая 2018

Вы можете разобрать это так, как это строка json

let trd = yourVar as? String

if let data = trd?.data(using: String.Encoding.utf8) {

   do {
           var content = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:String]

           print(content)

      } 
      catch let error as NSError {

           print(error)
     }
}
...