【SwiftUI】シンプルに HTTPリクエスト でお天気情報取得

単純に GET によるレスポンスボディを取得したい。

こんなにシンプルな感じでかけるとは!


let url = URL(string: "https://example.com")!
for try await line in url.lines {
  print(line)
}

👉 task(priority:_:) | Apple Developer Documentation hatena-bookmark

一行ごとに取れるようです。

試してみます。


import SwiftUI
import PlaygroundSupport

struct SampleView: View {
  @State private var message = "Loading..."

  var body: some View {
    Text(message)
      .task {
        message = await getWeather()
      }
  }

  private func getWeather() async -> String {
    let url = URL(string: "https://wttr.in/?format=3")!

    do {
      var lines: [String] = []
      for try await line in url.lines {
        lines.append(line)
      }
      return lines.joined()
    } catch {
      return "Faild to load"
    }
  }
}

PlaygroundPage.current.setLiveView(
  SampleView()
    .frame(width: 300, height: 300)
)

簡単にレスポンスを確認するときに使えそうです。

👉 lines | Apple Developer Documentation hatena-bookmark
👉 chubin/wttr.in: :partly_sunny: The right way to check the weather hatena-bookmark

 

😅 まさか String() でこんなことができるとか


print(
  (try? String(contentsOf: URL(string: "https://wttr.in/?format=3")!)) 
    ?? "Error!"
)

// Kisarazu, Japan: ⛅️  +25°C


【Xcode】Refactor - Rename ができない - Rename failed ✏️

これ。

どうやら、


~/Library/Developer/Xcode/DerivedData

を消せば良いそうです。

👉 【Xcode】Auto-Completion がおかしい 不具合の理由 → DerivedData hatena-bookmark
👉 Xcodeでリファクタリングに失敗するRename failed #Swift - Qiita hatena-bookmark

 

✏️ Behavors に登録しておく

すぐに忘れて毎回調べているので忘れないように登録しておきます。

まず、スクリプトファイルを作成しておいて、


#!/usr/bin/env bash

rm -rf ~/Library/Developer/Xcode/DerivedData
afplay /System/Library/Sounds/Glass.aiff

左上メニュー Xcode から Behavior に追加。

実行してから音がなるまで結構時間がかかるので、

結構な量のファイルが削除されていることが分かります。

 

✏️ まとめ

あと、

消した DerivedData は再び自動で作成される

Clean Build Folder では DerivedData は消えません

とのことです。


【Swift】Optional 型を使っても「nil」を書きたくない 🤔

みんな大嫌いな「nil」。

できればコード内に「nil」と書きたくありません。

見るのも嫌ですね!

あんまり高度な記述もアレなので、

初心者らしく調べてみました。

 

🤔 サンプルコード

スタートはこんなかんじです。


let age: Int? = nil

if age != nil {
  if age >= 18 {
    print("成人")
  }
}

エラーです。

 

🤔 OK な記述

以下、すべて等価。


if age != nil && age! >= 18 {
  print("成人")
}


if age != nil {
  if age! >= 18 {
    print("成人")
  }
}


if let age = age {
  if age >= 18 {
    print("成人")
  }
}

👉 【Swift初心者のための】オプショナル型と if let は何のためにあるの? #Swift - Qiita hatena-bookmark


if let _ = age {
  if age! >= 18 {
    print("成人")
  }
}


if let age {
  if age >= 18 {
    print("成人")
  }
}


if let age, age >= 18 {
  print("成人")
}

 

🤔 まとめ

nil でないことを確認してそのまま使いたい場合、


if let age {
  if age >= 18 {
    print("成人")
  }
}


if let age, age >= 18 {
  print("成人")
}

の記述は、覚えやすいし、便利に使えそう。

以下の、Apple 公式のサンプルコードが調べるきっかけになりました。

👉 sample-backyard-birds/BackyardBirdsData/Birds/Bird.swift at 1843d5655bf884b501e2889ad9862ec58978fdbe · apple/sample-backyard-birds hatena-bookmark