하루종일 토글을 키고 시작일 날짜를 바꿀 경우 화면에서는 종료일 날짜도 동일하게 변경되지만 실제 변수값은 오늘 날짜에서 바뀌지 않는다.
초기화 부분에서는 기본 종료시간을 무조건 시작일 기준으로 1시간 후로 설정하고 있다.
그러나 하루종일 토글값이 변경될 때와 시작일이 변경될 때, 종료일을 시작일과 동기화하는 로직이 없기에 → 시작일을 10일 뒤로 바꿔도 종료일은 여전히 10일 전으로 설정되어 있던 것.
// 일정 시작일, 종료일 초기화 코드
let endOfHour = calendar.date(byAdding: .hour, value: 1, to: startOfHour)!
self.endTime = endOfHour
하루종일 토글이 켜질 때와 일정 시작일이 바뀔 때, 종료일을 시작일과 동기화하도록 수정
@Published var isAllDay: Bool = true {
didSet {
if isAllDay {
// 하루종일이 켜지면 종료일을 시작일과 동일하게 설정
endTime = Calendar.current.startOfDay(for: startTime)
}
}
}
@Published var startTime: Date {
didSet {
if isAllDay {
// 하루종일일 때 시작일이 변경되면 종료일도 함께 변경
endTime = Calendar.current.startOfDay(for: startTime)
}
}
}
💡 didSet 이란?
프로퍼티 옵저버의 종류. 프로퍼티의 값이 변경된 직후에 호출되는 코드 블록을 정의할 수 있게 한다.프로퍼티 옵저버의 두 가지:
1.willSet
: 값이 변경되기 직전에 호출
2.didSet
: 값이 변경된 직후에 호출
변수의 초기화뿐 아니라 동기화 등 비즈니스 로직에 대해서도 세심하게 신경쓰자.