前回, サーバにJSONデータをリクエストしてAppで活用する方法を紹介しました. 今回は仕上げとして作成したAPIAccessorのブラッシュアップを行います.

  • 前回のコードに続けて書く
  • APIAccessor.requestPhotos()のエラー処理を行う
    • do { … } catch { … } をつかう. try!try に置き換えて例外を拾う
    • JSONDecoder().decodeguard letをつかう
      • try!try? に変更する
      • try? は異常時に例外の代わりにnilを返す. guardなどで判定できるようになる

コード1

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import Foundation

class APIAccessor {
    static func requestPhotos() async -> [PhotoData] {
        let api_photos = "https://archive.wdkk.co.jp/sf-swiftui/api/photos/"
        guard let url = URL( string:api_photos ) else { 
            print( "URLが正しくありません" )
            return []
        }
        
        let request = URLRequest( url:url )
        
        do {
            let result = try await URLSession.shared.data(for: request )
            guard let json = try? JSONDecoder().decode( [PhotoData].self, from:result.0 ) else {
                print( "JSONを正しく変換できませんでした" )
                return []
            }
            
            return json
        }
        catch {
            print( "データの取得に失敗しました" )
            return []
        }
    }
}

画面の結果は変わりませんが, サーバアクセスに失敗したりしたときコンソールにエラーが出力され, 動作しない原因が分かりやすくなりました. ためしにネットワークやデータ通信をOFFにしてAppを実行してみてください. ネットが繋がっていないのでサーバに接続できません.この場合「データの取得に失敗しました」とコンソールが出て, リストは空っぽになります.