質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1621閲覧

Swiftでカレンダーアプリ作成の際に、曜日に割り当てられる数値の変更

So0622

総合スコア8

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/08/22 03:34

編集2020/08/22 07:32

実現したいこと:曜日がずれているカレンダーアプリの作成

Swiftで、曜日がずれているカレンダーアプリを作成しようと考えています。
このサイト(https://qiita.com/ynakaDream/items/78c0c5ad9d1162de25f1)
を参考に、作成しているのですが、ここでは、曜日には
日曜日=0
月曜日=1
火曜日=2
水曜日=3
木曜日=4
金曜日=5
土曜日=6
と数字が割り当てられています。

これを
木曜日=0
金曜日=1
土曜日=2
日曜日=3
月曜日=4
火曜日=5
水曜日=6
として、数字を割り当てたい場合は、どの部分のコードをいじると良いのでしょうか?

以下、念のため、コードをシェアしました。
このファイルは、カレンダーに関する計算を行うファイルです。おそらく、このファイルに
該当箇所が存在するのではないかと考えています。よろしくお願いします。

###コード

Swift

1import Foundation 2 3protocol CalendarLogic: class { 4 func dateManager(year: Int, month: Int) 5 func numberOfWeeks(year: Int, month: Int) 6} 7 8class CalendarUseCase: CalendarLogic { 9 10 var responseForCalendar: ResponseForCalendar? 11 12 private let daysPerWeek = 7 13 private let isLeapYear = { (year: Int) in year % 400 == 0 || (year % 4 == 0 && year % 100 != 0) } 14 private let zellerCongruence = { (year: Int, month: Int, day: Int) in (year + year/4 - year/100 + year/400 + (13 * month + 8)/5 + day) % 7 } 15 16 func dateManager(year: Int, month: Int) { 17 let firstDayOfWeek = dayOfWeek(year, month, 1) 18 let numberOfCells = numberOfWeeks(year, month) * daysPerWeek 19 let days = numberOfDays(year, month) 20 let daysArray = alignmentOfDays(firstDayOfWeek, numberOfCells, days) 21 responseForCalendar?.responseDateManager(response: daysArray) 22 } 23 24 func numberOfWeeks(year: Int, month: Int) { 25 let weeks = numberOfWeeks(year, month) 26 responseForCalendar?.responseNumberOfWeeks(response: weeks) 27 } 28 29} 30 31//MARK:- Core Logic 32extension CalendarUseCase { 33 34 private func dayOfWeek(_ year: Int, _ month: Int, _ day: Int) -> Int { 35 var year = year 36 var month = month 37 if month == 1 || month == 2 { 38 year -= 1 39 month += 12 40 } 41 return zellerCongruence(year, month, day) 42 } 43 44 private func numberOfWeeks(_ year: Int, _ month: Int) -> Int { 45 if conditionFourWeeks(year, month) { 46 return 4 47 } else if conditionSixWeeks(year, month) { 48 return 6 49 } else { 50 return 5 51 } 52 } 53 54 private func numberOfDays(_ year: Int, _ month: Int) -> Int { 55 var monthMaxDay = [1:31, 2:28, 3:31, 4:30, 5:31, 6:30, 7:31, 8:31, 9:30, 10:31, 11:30, 12:31] 56 if month == 2, isLeapYear(year) { 57 monthMaxDay.updateValue(29, forKey: 2) 58 } 59 return monthMaxDay[month]! 60 } 61 62 private func conditionFourWeeks(_ year: Int, _ month: Int) -> Bool { 63 let firstDayOfWeek = dayOfWeek(year, month, 1) 64 return !isLeapYear(year) && month == 2 && (firstDayOfWeek == 0) 65 } 66 67 private func conditionSixWeeks(_ year: Int, _ month: Int) -> Bool { 68 let firstDayOfWeek = dayOfWeek(year, month, 1) 69 let days = numberOfDays(year, month) 70 return (firstDayOfWeek == 6 && days == 30) || (firstDayOfWeek >= 5 && days == 31) 71 } 72 73 private func alignmentOfDays(_ firstDayOfWeek: Int, _ numberOfCells: Int, _ days: Int) -> [String] { 74 var daysArray: [String] = [] 75 var dayCount = 0 76 for i in 0 ... numberOfCells { 77 let diff = i - firstDayOfWeek 78 if diff < 0 || dayCount >= days { 79 daysArray.append("") 80 } else { 81 daysArray.append(String(diff + 1)) 82 dayCount += 1 83 } 84 } 85 return daysArray 86 } 87 88}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Swift

1let zellerCongruence = { (year: Int, month: Int, day: Int) in (year + year/4 - year/100 + year/400 + (13 * month + 8)/5 + day) % 7 }

参照先のページよめばわかりますが、上記のクロージャでツェラーの公式を用いて曜日を求めていますので、ここを変えれば任意の曜日を 0 にすることが可能となります。

ツェラーの公式で最終的に行っていることは、計算した値を7で割ったあまり(剰余)を求めていることです。なので、剰余を求める前の値に定数を足し、木曜日のときにゼロとなるように調整すればいいことになります。

ツェラーの公式では、木曜日は4ですが、これにある数を足して7で割ったあまりが0になるためには、3を足せばよいことになりますから、

Swift

1let zellerCongruence = { (year: Int, month: Int, day: Int) in (year + year/4 - year/100 + year/400 + (13 * month + 8)/5 + day + 3) % 7 }

という具合に変更すれば良いのではないでしょうか。

投稿2020/08/22 04:00

TsukubaDepot

総合スコア5086

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

So0622

2020/08/22 07:29

なるほど!ツェラーの公式に+3すれば、解決できました ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問