【问题标题】:API call function Swift not reached?未达到 API 调用函数 Swift?
【发布时间】:2021-07-12 12:19:21
【问题描述】:

我正在尝试在我的 Swift 项目中进行 API 调用,但是当我运行代码时,程序无法通过 if let decodedJson = try? JSONDecoder().decode(JSONStructure.self, from: data) {

我添加了一些打印语句来澄清我的问题。

我在运行代码时也没有收到任何错误,但我猜那是因为我没有任何 catch 语句。但即使我补充说我仍然没有收到任何错误。我不知道这是否与我的问题有关,但我尝试使用 try! 而不是 try?,然后出现此错误:Initializer for conditional binding must have Optional type, not 'JSONStructure'

这是我的 API 调用函数:

 public func FetchTrip() {
        print("Level 1") //This prints
        Trips.removeAll()
        
        let tripKey = "40892db48b394d3a86b2439f9f3800fd"
        let tripUrl = URL(string: "http://api.sl.se/api2/TravelplannerV3_1/trip.json?key=\(tripKey)&originExtId=\(self.origin.iD)&destExtId=\(self.dest.iD)&Date=\(self.travelDate)&Time=\(self.arrivalTime)&searchForArrival=\(self.searchForArrival)")
        
        URLSession.shared.dataTask(with: tripUrl!) {data, response, error in
            print("Level 2") //This prints
            if let data = data {
                print("Level 3") //This prints
                do {
                    if let decodedJson = try? JSONDecoder().decode(JSONStructure.self, from: data) {
                        print("Level 4") //This does not print
                        // My logic here
                        
            }
        }.resume()

这是我用来访问 JSON 文件的结构:


struct JSONStructure: Decodable {
    var Trip: [TripStructure]
}

struct TripStructure: Decodable {
    var LegList: LegListStructure
}

struct LegListStructure: Decodable {
    var Leg: [LegStructure]
}

struct LegStructure: Decodable {
    var Origin: StationStructure
    var Destination: StationStructure
    var Product: ProductStructure
    var name: String
    var type: String
    var dist: String
}

struct StationStructure: Decodable {
    var time: String
    var name: String
    var date: String
}

struct ProductStructure: Decodable {
    var catIn: String
}

如果您想亲自查看JSON 文件,可以使用this URL

【问题讨论】:

    标签: json swift xcode api try-catch


    【解决方案1】:

    如果你不是do { } 块内,你可以使用if let decodedJson = try? JSONDecoder().decode(JSONStructure.self, from: data)。在这种情况下,decodedJson 只会在try? 成功的情况下获得一个值。

    在你的情况下,因为你在 do { } 块内,你应该只使用:

    do {
      let decodedJson = try JSONDecoder().decode(JSONStructure.self, from: data)
      //process decoded values here
      print(decodedJson)
    } catch {
      //deal with the error
      print(error)
    }
    

    如果失败,它将转到catch 部分。

    使用您当前拥有的!,它被隐式解包,告诉编译器它不会是nil,这就是if let调用在这里失败的原因——没有什么可以选择绑定的。

    补充阅读:

    【讨论】:

      猜你喜欢
      • 2015-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      • 2019-08-01
      • 2019-01-25
      相关资源
      最近更新 更多