Swift代码找不到数据的符号
Swift code can not find the symbol of the data
我是 swift 的新手。我正在尝试使用 swift 将 json 转换为模型。我正在使用通用函数来完成这些功能。这是 json .
的结构
这是我根据 jason 创建的模型。
import Foundation
// MARK: - Welcome
struct Welcome: Codable {
let photos: [Photo]
}
// MARK: - Photo
struct Photo: Codable {
let id, sol: Int
let camera: Camera
let imgSrc: String
let earthDate: String
let rover: Rover
enum CodingKeys: String, CodingKey {
case id, sol, camera
case imgSrc = "img_src"
case earthDate = "earth_date"
case rover
}
}
// MARK: - Camera
struct Camera: Codable {
let id: Int
let name: String
let roverID: Int
let fullName: String
enum CodingKeys: String, CodingKey {
case id, name
case roverID = "rover_id"
case fullName = "full_name"
}
}
// MARK: - Rover
struct Rover: Codable {
let id: Int
let name, landingDate, launchDate, status: String
enum CodingKeys: String, CodingKey {
case id, name
case landingDate = "landing_date"
case launchDate = "launch_date"
case status
}
}
这是通用函数中的代码。
func getModel<Model: Codable>(_ type: Model.Type, from url: String, completion: @escaping (Result<Model, NetworkError>) -> ()) {
guard let url = URL(string: url) else {
completion(.failure(.badURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(.other(error)))
return
}
if let data = data {
do {
let response = try JSONDecoder().decode(type, from: data)
completion(.success(response))
} catch let error {
completion(.failure(.other(error)))
}
}
}
.resume()
}
我试图从控制器调用此函数,但它显示错误 'Post' 类型的值没有成员 'data'
这里是调用函数的代码。
class ViewModel {
private let networkManager = NetworkManager()
private var rovers = [Post]()
func getStories (){
networkManager
.getModel(Post.self, from: NetworkURLs.baseURL) {[weak self]result in
switch result{
case .success(let response):
self?.rovers = response.data.camera.map{[=13=].data} **// error on this line**
case .failure( let error):
print( error.localizedDescription)
}
}
}
您的 response
是 Post
类型,没有 属性 data
。您需要从响应中提取照片数组,然后映射到该数组并从中检索 rovers
属性。
我想你想写的是
self?.rovers = response.photos.camera.map{[=10=].rover}
然而,即使这样也行不通,因为您的数据结构与您的 JSON 不匹配。可以看出,rover
是 photo
上的 属性 而不是 camera
.
上的 属性
您将需要验证 JSON -> 模型映射
编辑 在 JSON 链接在下面的评论中:
使用 API 中的 JSON,确认 camera
和 rover
在 JSON 中处于同一水平:
{
"photos": [
{
"id": 102693,
"sol": 1000,
"camera": {
"id": 20,
"name": "FHAZ",
"rover_id": 5,
"full_name": "Front Hazard Avoidance Camera"
},
"img_src": "http://mars.jpl.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/01000/opgs/edr/fcam/FLB_486265257EDR_F0481570FHAZ00323M_.JPG",
"earth_date": "2015-05-30",
"rover": {
"id": 5,
"name": "Curiosity",
"landing_date": "2012-08-06",
"launch_date": "2011-11-26",
"status": "active"
}
},
....
因此您需要更改数据模型:
struct Photo : Codable{
let id : Int
let sol : Int
let camera : Camera
let imgSrc: String
let earthDate: String
let rover: Rover
}
然后对其进行解码
self?.rovers = response.photos.map{[=13=].rover}
注意。在 Swift 中,所有结构类型都应按约定大写。
您的 Post 类型的结构确实没有名为“数据”的成员。
您似乎假设您的响应对象是 Photo 类型 - 但错误消息告诉您,它是 Post 类型,它只包含一个 Photo 对象数组。
试试这样的东西:
response.photos[0] 从数组中获取第一个 Photo 对象 - 如果有的话。
然后,假设您有一个 response.photos[0].data 已经为您提供了一个 Camera 对象 - 您似乎是通过类型而不是成员名称进行调用。
因此,如果您想更进一步并访问 Rover 对象,您需要执行以下操作:response.photos[0].data.data
我明白了,你想提取几个漫游者,据说每个 Post 一个,但这会与你的初始漫游者变量发生冲突,该变量被分配了一种类型的 Posts -这意味着您必须将其更改为 [Rover]。我不确定 map-function 是否真的适合您想在这里做的事情。
使用循环,迭代 Posts 并将 Rover 对象附加到 Rover 数组将是“手动”的方法。
希望对您有所帮助。
编辑:因为您已经编辑了您的模型mid-question,我现在看不到“Post”到哪里去了。我的回复可能只适合原问题的发布方式。
我是 swift 的新手。我正在尝试使用 swift 将 json 转换为模型。我正在使用通用函数来完成这些功能。这是 json .
的结构这是我根据 jason 创建的模型。
import Foundation
// MARK: - Welcome
struct Welcome: Codable {
let photos: [Photo]
}
// MARK: - Photo
struct Photo: Codable {
let id, sol: Int
let camera: Camera
let imgSrc: String
let earthDate: String
let rover: Rover
enum CodingKeys: String, CodingKey {
case id, sol, camera
case imgSrc = "img_src"
case earthDate = "earth_date"
case rover
}
}
// MARK: - Camera
struct Camera: Codable {
let id: Int
let name: String
let roverID: Int
let fullName: String
enum CodingKeys: String, CodingKey {
case id, name
case roverID = "rover_id"
case fullName = "full_name"
}
}
// MARK: - Rover
struct Rover: Codable {
let id: Int
let name, landingDate, launchDate, status: String
enum CodingKeys: String, CodingKey {
case id, name
case landingDate = "landing_date"
case launchDate = "launch_date"
case status
}
}
这是通用函数中的代码。
func getModel<Model: Codable>(_ type: Model.Type, from url: String, completion: @escaping (Result<Model, NetworkError>) -> ()) {
guard let url = URL(string: url) else {
completion(.failure(.badURL))
return
}
URLSession.shared.dataTask(with: url) { data, response, error in
if let error = error {
completion(.failure(.other(error)))
return
}
if let data = data {
do {
let response = try JSONDecoder().decode(type, from: data)
completion(.success(response))
} catch let error {
completion(.failure(.other(error)))
}
}
}
.resume()
}
我试图从控制器调用此函数,但它显示错误 'Post' 类型的值没有成员 'data'
这里是调用函数的代码。
class ViewModel {
private let networkManager = NetworkManager()
private var rovers = [Post]()
func getStories (){
networkManager
.getModel(Post.self, from: NetworkURLs.baseURL) {[weak self]result in
switch result{
case .success(let response):
self?.rovers = response.data.camera.map{[=13=].data} **// error on this line**
case .failure( let error):
print( error.localizedDescription)
}
}
}
您的 response
是 Post
类型,没有 属性 data
。您需要从响应中提取照片数组,然后映射到该数组并从中检索 rovers
属性。
我想你想写的是
self?.rovers = response.photos.camera.map{[=10=].rover}
然而,即使这样也行不通,因为您的数据结构与您的 JSON 不匹配。可以看出,rover
是 photo
上的 属性 而不是 camera
.
您将需要验证 JSON -> 模型映射
编辑 在 JSON 链接在下面的评论中:
使用 API 中的 JSON,确认 camera
和 rover
在 JSON 中处于同一水平:
{
"photos": [
{
"id": 102693,
"sol": 1000,
"camera": {
"id": 20,
"name": "FHAZ",
"rover_id": 5,
"full_name": "Front Hazard Avoidance Camera"
},
"img_src": "http://mars.jpl.nasa.gov/msl-raw-images/proj/msl/redops/ods/surface/sol/01000/opgs/edr/fcam/FLB_486265257EDR_F0481570FHAZ00323M_.JPG",
"earth_date": "2015-05-30",
"rover": {
"id": 5,
"name": "Curiosity",
"landing_date": "2012-08-06",
"launch_date": "2011-11-26",
"status": "active"
}
},
....
因此您需要更改数据模型:
struct Photo : Codable{
let id : Int
let sol : Int
let camera : Camera
let imgSrc: String
let earthDate: String
let rover: Rover
}
然后对其进行解码
self?.rovers = response.photos.map{[=13=].rover}
注意。在 Swift 中,所有结构类型都应按约定大写。
您的 Post 类型的结构确实没有名为“数据”的成员。 您似乎假设您的响应对象是 Photo 类型 - 但错误消息告诉您,它是 Post 类型,它只包含一个 Photo 对象数组。
试试这样的东西:
response.photos[0] 从数组中获取第一个 Photo 对象 - 如果有的话。 然后,假设您有一个 response.photos[0].data 已经为您提供了一个 Camera 对象 - 您似乎是通过类型而不是成员名称进行调用。 因此,如果您想更进一步并访问 Rover 对象,您需要执行以下操作:response.photos[0].data.data
我明白了,你想提取几个漫游者,据说每个 Post 一个,但这会与你的初始漫游者变量发生冲突,该变量被分配了一种类型的 Posts -这意味着您必须将其更改为 [Rover]。我不确定 map-function 是否真的适合您想在这里做的事情。 使用循环,迭代 Posts 并将 Rover 对象附加到 Rover 数组将是“手动”的方法。
希望对您有所帮助。
编辑:因为您已经编辑了您的模型mid-question,我现在看不到“Post”到哪里去了。我的回复可能只适合原问题的发布方式。