本記事はクソアプリ Advent Calendar 2022の参加記事になります!
はじめに
出かける時に雨が降っていたらもちろん傘をさして出かけることでしょう。
一方で現時点では降っておらず、夜の天気が怪しくて傘を持っていくかどうかを悩んだこともあるかと思います。
この時に頼りになるのが天気予報です。
しかしこんなもやもやを感じたことはないでしょうか。
「降水確率30%か。で、結局傘は必要なの?」
そうです。
私たちが知りたいのは降水確率ではありません。
傘がいるかいらないかです。
今回はこのような不満を持つすべての人の思いを叶えるアプリを作りました。
アプリの使い方
アプリの使い方は至って簡単です。
ホーム画面がこちら。

「占う」を押したらOK!
傘を持って行くべきかどうか占い結果を教えてくれます。
傘がいらない場合はこちらの画面。

傘がいる場合もばっちり分かります。

傘がいるかいらないかの結論は出ているので不要な情報ではありますが、念のために夜の降水確率も分かります。
以上!
環境
Xcode14.1
Swift5
実装について
ホーム画面
APIはこちらを使用しています。
※東京の天気を基準にしています。
※おでかけから帰る時の天気で傘の有無を判断するのが前提のため、当日の18:00-24:00の降水確率を用いてます。
画面遷移ではiOS16から追加されたNavigationStack
を使ってます。
import SwiftUI
struct ContentView: View {
let viewModel = ForecastViewModel()
@State private var path = [Int]()
var body: some View {
NavigationStack(path: $path) {
Text("今日、傘いる?")
Image("uranai_suisyou")
.resizable()
.frame(width: 200, height: 200)
Button {
Task {
let chanceOfRain = await viewModel.getChanceOfRains()
guard let chanceOfRain = chanceOfRain else { return }
path.append(chanceOfRain)
}
} label: {
Text("占う")
}
.navigationDestination(for: Int.self) { value in
FortuneTellingView(chanceOfRain: value)
}
}
}
}
占いの結果画面
傘の有無判定は降水確率をベースにしています。
降水確率の割合が傘がいると表示される割合になるようにしました。
つまり降水確率30%なら傘が必要って結果が出る確率が30%となります。
傘の有無判定を含む占い結果画面のコードがこちらになります。
import SwiftUI
struct FortuneTellingView: View {
@State var chanceOfRain: Int
var body: some View {
if isHeigherThanRandomInt() {
Text("傘を持って行きましょう!")
Image("walking_rain_man")
.resizable()
.scaledToFit()
.frame(width: 300, height: 300)
} else {
Text("傘はきっといらないでしょう!")
Image("tenki_hare_onna")
.resizable()
.scaledToFit()
.frame(width: 300, height: 300)
}
Text("(今夜、東京の降水確率は\(chanceOfRain)%です)")
}
private func isHeigherThanRandomInt() -> Bool {
let randomInt = Int.random(in: 1...100)
return randomInt <= chanceOfRain
}
}
ソースコード全体はこちらです。
最後に
これから天気予報を見て迷いが生じることを回避できるようになりました!!!
ところで沖縄の方は雨でも傘はささないという噂を聞いたことがあるんですが本当ですか?
(以下ネットで適当に拾った記事)
もし本当なら、見習って傘をささない選択を常に取ることが根本的な解決策かもしれませんね。
アドカレ初参戦がこんな記事になりました。
ちなみにこのアプリ、数年前にフワッと浮かんでいたことをふと思い出して作ったので今回ようやく供養できた形になります。
えぇそりゃもう、作りながら「大丈夫かこれ?」ってずっと感じてますよ。
ただクソアプリアドカレの概要にもこう書いてます。
今年も役に立たない、世の中に貢献しないアプリとかサービスを出しあって遊ぼうぜ!
きっと胸を張っていいでしょう。
お粗末さまでした。