88import SnapKit
99import UIKit
1010
11+ protocol WeekViewDelegate : AnyObject {
12+ func weekView( _ sender: WeekView , didMoveWeek weekStartDate: Date )
13+ func weekView( _ sender: WeekView , didSelectDate date: Date )
14+ }
15+
1116final class WeekView : UIView {
1217
1318 private enum Layout {
@@ -30,13 +35,14 @@ final class WeekView: UIView {
3035 private let today = Date ( )
3136 private var selectedDate = Date ( )
3237 private var currentWeekStartDate = Date ( )
38+ weak var delegate : WeekViewDelegate ?
3339
3440 init ( ) {
3541 super. init ( frame: . zero)
3642 configureAttribute ( )
3743 configureLayout ( )
38- setupCurrentWeek ( )
39- setWeekDateViews ( )
44+ calculateCurrentWeek ( )
45+ updateWeekDateViews ( )
4046 }
4147
4248 required init ? ( coder: NSCoder ) {
@@ -104,21 +110,21 @@ final class WeekView: UIView {
104110 }
105111 }
106112
107- // 날짜 세팅 및 현재 주의 첫째날 세팅
108- private func setupCurrentWeek ( ) {
113+ // 현재 날짜 세팅 및 현재 주의 첫째날을 세팅합니다.
114+ private func calculateCurrentWeek ( ) {
109115 selectedDate = today
110- currentWeekStartDate = getWeekStartDate ( for: today)
116+ currentWeekStartDate = calculateWeekStartDate ( for: today)
111117 }
112118
113- // 현재 주의 첫째 날을 뱉어줌
114- private func getWeekStartDate ( for date: Date ) -> Date {
119+ // 현재 주의 첫째 날을 계산해줍니다.
120+ private func calculateWeekStartDate ( for date: Date ) -> Date {
115121 let weekday = calendar. component ( . weekday, from: date)
116122 let daysFromMonday = ( weekday == 1 ) ? 6 : weekday - 2
117123 return calendar. date ( byAdding: . day, value: - daysFromMonday, to: date) ?? date
118124 }
119125
120- // current 주에 맞춰 DateView들 세팅
121- private func setWeekDateViews ( ) {
126+ // 현재 주에 맞춰 DateView들 업데이트합니다.
127+ private func updateWeekDateViews ( ) {
122128 dateViews. values. forEach {
123129 $0. removeFromSuperview ( )
124130 }
@@ -135,7 +141,7 @@ final class WeekView: UIView {
135141 isSelected: isSelected,
136142 isToday: isToday)
137143 dateView. didTappedDateButton = { [ weak self] date in
138- self ? . dateSelected ( date: date)
144+ self ? . selectDate ( date: date)
139145 }
140146 dateViews [ date] = dateView
141147 dateStackView. addArrangedSubview ( dateView)
@@ -145,34 +151,39 @@ final class WeekView: UIView {
145151 }
146152 }
147153
148- // 선택한 날짜의 dateView update
154+ // 선택한 날짜의 dateView를 업데이트합니다.
149155 private func updateSelectState( ) {
150156 for (date, dateView) in dateViews {
151157 let isSelected = calendar. isDate ( date, inSameDayAs: selectedDate)
152158 dateView. updateSelectState ( isSelected: isSelected)
153159 }
154160 }
155161
156- // 날짜 선택
157- private func dateSelected ( date: Date ) {
162+ // 날짜를 선택합니다.
163+ private func selectDate ( date: Date ) {
158164 selectedDate = date
159165 updateMonthLabel ( )
160166 updateSelectState ( )
167+
168+ delegate? . weekView ( self , didSelectDate: date)
161169 }
162170
163- // month Label update
171+ // monthLabel를 업데이트합니다.
164172 private func updateMonthLabel( ) {
165173 monthLabel. text = selectedDate. convertToString ( dateType: . yearMonth)
166174 }
167175
168- // 주를 움직여요
176+ // 주(week)를 이동합니다.
169177 private func moveWeek( by week: Int ) {
170178 guard let newWeekStartDate = calendar. date ( byAdding: . weekOfYear, value: week, to: currentWeekStartDate)
171179 else { return }
172180 currentWeekStartDate = newWeekStartDate
173181
174182 selectedDate = currentWeekStartDate
175183 updateMonthLabel ( )
176- setWeekDateViews ( )
184+ updateWeekDateViews ( )
185+
186+ delegate? . weekView ( self , didMoveWeek: currentWeekStartDate)
187+ delegate? . weekView ( self , didSelectDate: selectedDate)
177188 }
178189}
0 commit comments