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]
}
}
カンマ区切りなので、","カンマで分けます。
ContentViewでは、List()で表示させるのは構造体を使うのでまず変数に構造体を代入します。
変数usersより構造体のプロパティを取ってきて表示させます。ここではVStackを使ってますが、構造を単純化すると
となります。
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からのデータを変数に代入して以下の処理します。
compactMapについては
全体は
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{
}
}
}
}
この記事が気に入ったらサポートをしてみませんか?