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)
                }
            }
        
    }

您的 responsePost 类型,没有 属性 data。您需要从响应中提取照片数组,然后映射到该数组并从中检索 rovers 属性。

我想你想写的是

self?.rovers = response.photos.camera.map{[=10=].rover}

然而,即使这样也行不通,因为您的数据结构与您的 JSON 不匹配。可以看出,roverphoto 上的 属性 而不是 camera.

上的 属性

您将需要验证 JSON -> 模型映射

编辑 在 JSON 链接在下面的评论中:

使用 API 中的 JSON,确认 camerarover 在 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”到哪里去了。我的回复可能只适合原问题的发布方式。