当尝试使用可编码协议获取JSON时,“参数类型字符串不符合预期的类型解码器”

时间:2018-01-19 14:08:43

标签: swift codable

我正在尝试使用Swift 4 Codable功能来获取JSON,但由于某种原因,它会产生一个错误:

  

参数类型字符串不符合预期的类型解码器

这是我的代码:

Xcode Screenshot

import UIKit

struct aURL : Codable {
    let title: String
    let aurl: String
    //    let style: URLStyle
}

 class SectionTableViewController: UITableViewController {

 override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    do {
        let queue = DispatchQueue(label: "cool")
        queue.async {

            if let somedata = try? Data(contentsOf: URL(from: "http://json-schema.org/example/geo.json")!, options: []) {

                let json = try? JSONSerialization.jsonObject(with: somedata, options: [])
                print(json)

                DispatchQueue.main.async {

                }
            }

        }
    } catch let error as NSError {
        print("Error: \(error)")
    }

}

如果我尝试使用Xcode修复它,建议修复如图所示:

Xcode Screenshot

我收到此错误:

Xcode Screenshot

  

无法将'Swift.String'(0x1015acf68)类型的值转换为'Swift.Decoder'(0x1015ec460)。

1 个答案:

答案 0 :(得分:3)

存在误解。

URL API

init(from decoder: Decoder) throws

可以 在自定义结构中使用来创建来自给定Decoder的网址,该网址与该类的init(coder API非常相似相关的NSCoding协议。

在从字符串创建网址的上下文中,您必须使用URL(string

URL(string: "http://json-schema.org/example/geo.json")!

这正是错误消息所说的内容: 我期待Decoder但我得到String

重要提示:

从不使用同步API Data(contentsOF:从远程URL加载数据 - 甚至不在异步调度队列中 - 并且不要随意忽略try?的错误