Swift-如何在struct中启动阵列



我不确定如何在Struct中启动数组。我无法从数组中获取数据,同时我设法从对象获得结果(platform.status(。

我是错误的吗?有什么想法吗?

这是网络请求:

func fetchServicePlatform(token: String, _key: String) {
        let selectedUrl = URL(string: "(mainUrl)/get_service")
        let parameters: [String: String] = ["_key": _key]
        var serviceList = [ServiceList]()
        URLSession.shared.dataTask(with: setupURLRequest(selectedURL: selectedUrl!, parameters: parameters, token: token, email: "test@gmail.com")) { (data, response, error) in
            if let err = error {
                print("Failed to fetch API: (err.localizedDescription)")
            }
            guard let data = data else { return }
            do {
                guard let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String: Any] else { return }
                let platform = Platform(json: json)
                if platform.status == "success" {
                    self.serviceList = platform.service_list
                    DispatchQueue.main.async {
                        self.collectionView.reloadData()
                    }
                }
            } catch let jsonErr {
                print("Failed to fetch service platform: ", jsonErr.localizedDescription)
            }
        }.resume()
    }

这是JSON:

{
    "status": "pass",
    "service_list": [
        {
            "title": "Plumber",
            "description": "Plumber",
            "image": "https://s3-ap-southeast-1.heroku.com.png"
        },
        {
            "title": "Cleaner",
            "description": "Cleaner",
            "image": "https://s3-ap-southeast-1.heroku.com.png"
        }
    ]
}

这是结构:

struct Platform {
    let service_list: [ServiceList]
    let status: String
    init(json: [String: Any]) {
        service_list = [ServiceList(json: json["service_list"] as? [String: Any] ?? [:])]
        status = json["status"] as? String ?? ""
    }
}

struct ServiceList {
    let title: String
    let description: String
    let image: String
    init(json: [String: Any]) {
        title = json["title"] as? String ?? ""
        description = json["description"] as? String ?? ""
        image = json["image"] as? String ?? ""
    }
}

在您的数据 json["service_list"]中是字典数组,

您可以尝试。

struct Platform {
    var service_list: [ServiceList] = []
    var status: String
    init(json: [String: Any]) {
        if let jsonArray = json["service_list"] as? [[String: Any]] {
            for service in jsonArray {
                service_list.append(ServiceList(json: service))
            }
        }
        else{
            service_list = []
        }
        status = json["status"] as? String ?? ""
    }
}

init instruct

中的数组
struct MyData {
  var dataArray:[Any] = []
  var latitude:  Float
  var longitude: Float
}

您必须将字典解开为字典数组,然后用映射或flatmap循环,在其中使用值 $0作为值

guard let serviceList = (json["service_list"] as? [[String: Any]])?.flatmap({ServiceList(withDictionary: $0)})

使用以下方法,这样就更简单

使用Codable

创建您的结构
struct Platform: Codable {
    let service_list: [ServiceList]
    let status: String
    enum CodingKeys: String, CodingKey {
        case service_list, status
    }
}

struct ServiceList: Codable {
    let title: String
    let description: String
    let image: String
    enum CodingKeys: String, CodingKey {
        case title, description, image
    }
}

您的JSON数据对象

let json = """
{
    "status": "pass",
    "service_list": [
    {
    "title": "Plumber",
    "description": "Plumber",
    "image": "https://s3-ap-southeast-1.heroku.com.png"
    },
    {
    "title": "Cleaner",
    "description": "Cleaner",
    "image": "https://s3-ap-southeast-1.heroku.com.png"
    }
    ]
}
""".data(using: .utf8)!

使用JSONDecoder将JSON对象映射到结构

let decoder = JSONDecoder()
let platform = try! decoder.decode(Platform.self, from: json)
if platform.status == "pass"{
    for service in platform.service_list{
        print(service.title)
    }
}

最新更新