2017-12-07 9 views
0

JSONデータを取得するために、以下のコードを使用しています。 「ロード後のエラー」を返します。私は別のアプリケーションでこのJSONデータを使用しています。私はSwift 4を使って新しい単純化されたメソッドを実装しようとしています。コードはprintステートメントのポイントまで "ダウンロード"します。Swift 4とXcode 9でJSONデータを取得

class MortgageRatesVC: UIViewController { 
    final let url = URL (string:"http://mortgous.com/JSON/currentRatesJSON.php") 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     downloadJason() 
    } 

    func downloadJason() { 
     guard let downloadURL = url else { return } 
     URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in 
      guard let data = data, error == nil, urlResponse != nil else { 
       print("Oops Call for Help") 
       return 
      } 

      print("downloaded") 
      do 
      { 
       let decoder = JSONDecoder() 
       let rates = try decoder.decode([LenederRates].self, from: data) 
       print(rates) 
      } catch { 
       print("Error after loading") 
      } 
     }.resume() 
    } 
} 

クラス

class LenederRates: Codable { 
    let key : String 
    let financial_institution : String 
    let variable_rate : String 
    let six_months : String 
    let one_year : String 
    let two_year : String 
    let three_year : String 
    let four_year : String 
    let five_year : String 
    // let date : Date 

    init(key: String, financial_institution: String, variable_rate: String, six_months: String, one_year: String, two_year: String, three_year: String, four_year: String, five_year: String) { 
     self.key = key 
     self.financial_institution = financial_institution 
     self.variable_rate = variable_rate 
     self.six_months = six_months 
     self.one_year = one_year 
     self.two_year = two_year 
     self.three_year = three_year 
     self.four_year = four_year 
     self.five_year = five_year 
    } 
} 
+0

あなたが取得している完全なエラーは何を? – tylerSF

+0

それは私に迅速なエラーを与えていない。私のコードプリントのエラーで停止します( "ロード後のエラー")。私は思うJSONを読むことができません! –

+1

実際のエラーを調べるために、 'print'ブランチに' print(error) 'を追加してください。 –

答えて

0

問題は、あなたのCodableクラスで不足しているプロパティの日付です。デコーダdateDecodingStrategy.formattedに設定し、固定フォーマットのdateFormatterを渡す必要があります。ところで私は、構造体のために自分のクラスを変更することをお勧め、キャメルケーススウィフトの命名規則を使用して、プロパティ名を変更し、カスタムCodingKeys提供:

struct LenederRates: Codable { 
    let key: String 
    let financialInstitution : String 
    let variableRate: String 
    let sixMonths: String 
    let oneYear: String 
    let twoYear: String 
    let threeYear: String 
    let fourYear: String 
    let fiveYear: String 
    let date: Date 
    private enum CodingKeys: String, CodingKey { 
     case key, financialInstitution = "financial_institution", variableRate = "variable_rate", sixMonths = "six_months", oneYear = "one_year", twoYear = "two_year", threeYear = "three_year", fourYear = "four_year", fiveYear = "five_year", date 
    } 
} 

let mortgousURL = URL(string:"http://mortgous.com/JSON/currentRatesJSON.php")! 
URLSession.shared.dataTask(with: mortgousURL) { data, urlResponse, error in 
    guard let data = data else { return } 
    do { 
     let dateFormat = DateFormatter() 
     dateFormat.locale = Locale(identifier: "en_US_POSIX") 
     dateFormat.dateFormat = "yyyy-MM-dd" 
     let decoder = JSONDecoder() 
     decoder.dateDecodingStrategy = .formatted(dateFormat) 
     let rates = try decoder.decode([LenederRates].self, from: data) 
     print(rates) 
    } catch { 
     print(error) 
    } 
}.resume() 
+0

偉大な応答をいただきありがとうございました。私はあなたがルーキーであることがわかると確信しています。コーディングの問題を解決できる多くの方法を驚かせています。もう一度ありがとう! –

+0

あなたは歓迎です –

+0

@KevinProctorあなたのテーブルビューコントローラのインスタンスプロパティとして配列を宣言する必要があります。メソッドの中に宣言すると、メソッドが終了するとすぐに範囲外になります。したがって、テーブルビューコントローラ(そのメソッドの外)とデータタスククロージャ 'rates = try decoder ...'の中で 'var rates:[LenederRates] = []'という宣言を追加し、次の行にテーブルビューをリロードします –

関連する問題