最近、SwiftUIからiOS開発の勉強を始めたものです。
カレンダーアプリを作りたいと考えています。
知りたいこと
画像のカレンダーアプリのように、Navigation Barの下に曜日を表示させたいです。
この時、日曜始まりか月曜始まりかを選択できるようにしたいと考えています。
機能としては実装できたのですが、煩雑なコードになってしまっていると思います。
extentionなどを使えばもっと簡潔にかけるのではないか?と思うのですが、そのやり方がわかりません。
試したこと
以下の構造体を自分なりに書いてみました。やりたかった動作は実現できています。
WeekdaySymbolsView(true)
なら日曜始まりで 日_月_火_水_木_金_土
と表示されます。
WeekdaySymbolsView(false)
なら月曜始まりで 月_火_水_木_金_土_日
と表示されます。
(※ アンダースコアはSpacerを表しています)
実際のコードは次の通りです。
// 日曜始まり または 月曜始まり のViewを生成するstruct struct WeekdaySymbolsView: View { let beginWithSunday: Bool // true: 日曜始まり, false: 月曜始まり let formatter: DateFormatter // 曜日を取得するために用いる let weekdaySymbols: [String] // 曜日のString型配列を格納 let indexFrom: Int // ForEachのfromの値を格納 let indexTo: Int // ForEachのtoの値を格納 // 日曜始まり(true) か 月曜始まり(false) を引数として渡し初期化を行う init(beginWithSunday: Bool) { self.beginWithSunday = beginWithSunday formatter = DateFormatter() formatter.locale = Locale(identifier: "ja_JP") weekdaySymbols = formatter.shortWeekdaySymbols // ["日", "月", "火", "水", "木", "金", "土"] // ForEachのfromとtoを決定する // 取得した配列 ["日", "月", "火", "水", "木", "金", "土"] から 0: 日曜日、1: 月曜日 ・・・ 6: 土曜日 と対応している // 日曜始まりの場合: ForEach(0 ..< 6) となり、fromは0、toは6 となる // 月曜始まりの場合: ForEach(1 ..< 7) となり、fromは1、toは7 となる indexFrom = beginWithSunday ? 0 : 1 indexTo = beginWithSunday ? weekdaySymbols.count - 1 : weekdaySymbols.count } // 土曜日と日曜日の値を定義するenum enum Weekday: Int { case saturday = 6 case sunday = 0 } var body: some View { // 7つの曜日を横並びに表示するView HStack { // ForEachで 週の始まりの曜日から最後の曜日を除いた曜日まで "曜日 スペーサ" をループで生成する // 日曜始まりの場合: "日曜日(0)〜金曜日(5) スペーサ" のループ // 月曜始まりの場合: "月曜日(1)〜土曜日(6) スペーサ" のループ ForEach(indexFrom ..< indexTo) { weekday in Text(self.weekdaySymbols[weekday]) Spacer() } // 日曜始まりの場合: 残りの "土曜日(6)" をenumを用いて表示 // 月曜始まりの場合: 残りの "日曜日(0)" をenumを用いて表示 Text(beginWithSunday ? weekdaySymbols[Weekday.saturday.rawValue] : weekdaySymbols[Weekday.sunday.rawValue]) } .font(.system(size: 10)) .frame(height: 0) .padding() } }
もっと簡潔な、Swift(UI)らしい書き方はありますでしょうか?
enumも初めて使ったので正しい用法なのか分かっていません。
別に関数を作った方がいいなど、何でも良いのでコードレビューをお願いしたいです。
アドバイスを頂けると嬉しいです。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/05 22:10