0

我正在尝试快速从我的数据库中提取图像。我可以检索价格、视频和 p_name,但不能检索图像。我想UIImageView用数据库中的图像更新 updateImage,但出现两个错误。

错误一说:

类型“ViewController.Class”不符合协议“Encodable”

错误二说:

类型“ViewController.Class”不符合协议“Dec”

有什么好的解决方法?

这是JSON:

{
"id":"1",
"p_name":"item_one",
"image":"item_one.png"
}
{
"id":"2","p_name":
"item_two","image":
"item_two.img"
}

还有快速代码:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var updateLabel: UILabel!

@IBOutlet weak var updateImage: UILabel!

struct Class: Codable
{
    let id: String
    let p_name: String
    let image: String

}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let url = URL(string: "http://host-2:8888//getClasses.php")

    // Load the URL
    URLSession.shared.dataTask(with: url!, completionHandler: {(data, response, error) in
        // If there are any errors don't try to parse it, show the error
        guard let data = data, error == nil else { print(error!); return }

        let decoder = JSONDecoder()
        let classes = try! decoder.decode([Class].self, from: data)
        // Print out the classes to the console - try sticking this in a table view :)
        for myClass in classes {

            self.updateLabel.text = myClass.p_name
            self.updateImage.text = myClass.image

        }

    }).resume()

    }
}
4

1 回答 1

0

首先,如果您从 API 获取的密钥与 中的属性名称相同Codable Type,那么您不需要enum CodingKeys明确指定,即您可以简单地使用:

struct Class: Codable
{
    let id: String
    let p_name: String
    let image: String
}

据我了解,您必须JSON data通过以下方式解码您获得的信息:

    let jsonString = """
    [
        {"id": "1", "p_name": "P1", "image": "V1"},
        {"id": "2", "p_name": "P2", "image": "V2"},
        {"id": "3", "p_name": "P3", "image": "V3"}
    ]
    """
    if let jsonData = jsonString.data(using: .utf8)
    {
        let obj = try? JSONDecoder().decode([Class].self, from: jsonData)
        print(obj)
    }

在上面的代码中,我刚刚使用了一个示例JSON string。如需更多说明,您必须添加JSON从 API 获得的确切响应。

现在,如果您还期望来自 API 的图像 url,那么您还没有添加任何属性来将该 url 字符串存储在struct Class.

一旦您为您的问题添加更多信息,我将能够为您提供更多帮助。

于 2018-03-18T17:35:35.283 回答