我正试图在swift中从我的数据库中提取图像。我可以检索价格,视频和p_name,但不能检索图像。我想用数据库中的图像更新updateImage UIImageView
但我得到两个错误。
错误一说:
类型'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()
}
}
答案 0 :(得分: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
。要获得更多说明,您必须添加从API获得的确切JSON
响应。
现在,如果您还期待来自API的图片网址,则您还没有添加任何属性来将该网址字符串存储在struct Class
中。
一旦您在问题中添加更多信息,我就能为您提供更多帮助。