微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI API解码

如何解决SwiftUI API解码

我正在尝试从Yelp解码有关业务详细信息的JSON响应。 JSON响应会像这样返回:

{
"id": "ATaQ4GLQisXA7tylsJobhQ","alias": "chicken-fire-orlando","name": "Chicken Fire","image_url": "https://s3-media4.fl.yelpcdn.com/bphoto/YMkiKEv-WApzbJZ321rsEg/o.jpg","is_claimed": true,"is_closed": false,"url": "https://www.yelp.com/biz/chicken-fire-orlando?adjust_creative=s-hyKAjsx6P4UW-uqMn7aQ&utm_campaign=yelp_api_v3&utm_medium=api_v3_business_lookup&utm_source=s-hyKAjsx6P4UW-uqMn7aQ","phone": "","display_phone": "","review_count": 107,"categories": [
    {
        "alias": "chickenshop","title": "Chicken Shop"
    }
],"rating": 5.0,"location": {
    "address1": "2406 E Washington St","address2": "","address3": null,"city": "Orlando","zip_code": "32803","country": "US","state": "FL","display_address": [
        "2406 E Washington St","Orlando,FL 32803"
    ],"cross_streets": ""
},"coordinates": {
    "latitude": 28.5438637820401,"longitude": -81.3516076281667
},"photos": [
    "https://s3-media4.fl.yelpcdn.com/bphoto/YMkiKEv-WApzbJZ321rsEg/o.jpg","https://s3-media3.fl.yelpcdn.com/bphoto/gLcMNuoaJonieGFsSS9qeA/o.jpg","https://s3-media4.fl.yelpcdn.com/bphoto/oWAPiL4nQLab-PrrEoQ30A/o.jpg"
],"hours": [
    {
        "open": [
            {
                "is_overnight": false,"start": "1200","end": "1500","day": 3
            },{
                "is_overnight": false,"start": "1700","end": "2000","day": 4
            },"day": 5
            },"day": 6
            },"day": 6
            }
        ],"hours_type": "REGULAR","is_open_Now": true
    }
],"transactions": [
    "delivery","pickup"
]
}

为简单起见,我只想简单介绍3件事。

struct BusinessDetails: Codable,Identifiable {
    let id: String
    let name: String
    let image_url: String
}


public class Api: ObservableObject {
    func getDetails(completion: @escaping (BusinessDetails) -> ()) {
        let apikey = "API KEY HERE"
        let url = URL(string: "https://api.yelp.com/v3/businesses/ATaQ4GLQisXA7tylsJobhQ")!
        var request = URLRequest(url: url)
        request.setValue("Bearer \(apikey)",forHTTPHeaderField: "Authorization")
        request.httpMethod = "GET"
        
        URLSession.shared.dataTask(with: request) {(data,_,_) in
            let details = try! JSONDecoder().decode(BusinessDetails.self,from: data!)
            
            dispatchQueue.main.async {
                completion(details)
                print("Below are details")
                print(details)
            }
        }.resume()
    }
}

我发现我能够获取要在视图中显示的信息,但是当我错误调用函数时,我显然具有语法。

我正在使用:

import SwiftUI
import SDWebImageSwiftUI

struct Details: View {
    @State var details: [BusinessDetails] = []
    
    var body: some View {
        ScrollView (/*@START_MENU_TOKEN@*/.vertical/*@END_MENU_TOKEN@*/,showsIndicators: false) {
            ForEach(details) { detail in
                vstack {
                    WebImage(url: URL(string: detail.image_url))
                        .onSuccess { image,data,cacheType in
                    }
                    .resizable()
                    .placeholder(Image(systemName: "photo"))
                        
                    .placeholder {
                        Rectangle().foregroundColor(.gray)
                    }
                    .indicator(.activity)
                    .transition(.fade(duration: 0.5))
                    .scaledToFill()
                    .frame(minWidth: 0,maxWidth: .infinity,minHeight: 100,maxHeight: 250)
                    .clipped()
                }.padding(.vertical,8)
            }.onAppear {
                Api().getDetails { (details) in
                    self.details = details
                }
            }
        }
        
    }
}

在我的函数中打印显示

"BusinessDetails(id: "ATaQ4GLQisXA7tylsJobhQ",name: "Chicken Fire",image_url: "https://s3-media4.fl.yelpcdn.com/bphoto/YMkiKEv-WApzbJZ321rsEg/o.jpg")"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。