見出し画像

SwiftUIでいこう! - APIでTXT,CSV取得。

参考サイトを確認しながらコードを書いて実行してみます。APIとしてテキストファイル、CSVファイルをアドレスより取得して使っていきます。APIは参考サイトのもので行ってます。(Xcode Playgroundで実行)

テキストファイル

まずテキストファイルを読み込みます。

struct ContentView: View {
    @State private var quates = [String]()
    
    var body: some View {
        List(quates,id:\.self,rowContent: Text.init)
            .task{
                do{
                    let url = URL(string:"https://www.hackingwithswift.com/samples/quotes.txt")!
                    for try await quate in url.lines{
                        quates.append(quate)
                    }
                }catch{  
                }
        }
    }
}

List()を使って表示させます。APIからデータを読み込む方法として

"url.lines"を使います。

The URL’s resource data, as an asynchronous sequence of lines of text.
URLからのテキストデータを非同期で取得します。

ということで、公式リファレンス。

あとはモディファイアを使い".task"を使い、do catchで実行します。

"try await"

を使って

@State private var quates = [String]()

と宣言している変数にurlから取り出したデータを入れていきます。

for try await quate in url.lines{
           quates.append(quate)
}

このデータをList()に反映させて表示させます。


CSVファイル

CSVファイルの場合は読み込む項目の構造体を作って、その構造体に反映させる形でリストに表示させます。

struct User:Identifiable{
    let id:Int
    let firstName:String
    let lastName:String
    let country:String
    
    init?(csv:String){
        let field = csv.components(separatedBy: ",")
        guard field.count == 4 else{return nil}
        
        self.id = Int(field[0]) ?? 0
        self.firstName = field[1]
        self.lastName = field[2]
        self.country = field[3]
    }
}

カンマ区切りなので、","カンマで分けます。

let field = csv.components(separatedBy: ",")

ContentViewでは、List()で表示させるのは構造体を使うのでまず変数に構造体を代入します。

変数usersより構造体のプロパティを取ってきて表示させます。ここではVStackを使ってますが、構造を単純化すると

List(users){user in
        Text()
}

となります。

struct ContentView: View {

    @State private var users = [User]()
    
    var body: some View {
        List(users){user in
            VStack(alignment: .leading){
                Text("\(user.firstName) \(user.lastName)")
                    .font(.headline)
                Text(user.country)
            }
        }
            .task{
                do{
                    let url = URL(string:"https://www.hackingwithswift.com/samples/users.csv")!
                    let userData = url.lines.compactMap(User.init)
                    for try await user in userData{
                        users.append(user)
                    }
                }catch{  
                }
        }
    }
}

データの読み込みは基本的にはテキストファイルと同じように".task"でURLからのデータを変数に代入して以下の処理します。

let userData = url.lines.compactMap(User.init)

compactMapについては

変換した結果に nil が含まれる場合、戻り値には nil を含まない配列に変換する関数。

全体は

struct User:Identifiable{
    let id:Int
    let firstName:String
    let lastName:String
    let country:String
    
    init?(csv:String){
        let field = csv.components(separatedBy: ",")
        guard field.count == 4 else{return nil}
        
        self.id = Int(field[0]) ?? 0
        self.firstName = field[1]
        self.lastName = field[2]
        self.country = field[3]
    }
}

struct ContentView: View {

    @State private var users = [User]()
    
    var body: some View {
        List(users){user in
            VStack(alignment: .leading){
                Text("\(user.firstName) \(user.lastName)")
                    .font(.headline)
                Text(user.country)
            }
        }
            .task{
                do{
                    let url = URL(string:"https://www.hackingwithswift.com/samples/users.csv")!
                    let userData = url.lines.compactMap(User.init)
                    for try await user in userData{
                        users.append(user)
                    }
                }catch{  
                }
        }
    }
}


この記事が気に入ったらサポートをしてみませんか?