안녕하세요 ! :)
이번 포스팅에서는 Date struct를 이용해서 날짜 계산이 필요할 때 어떻게 쓸 지!에 대해 다뤄보겠습니다.
이 포스팅은 제가 커스텀 캘린더를 만들기 위해 사용했던 Date extension에 대해 설명해보려고 합니다.
Date 구조체는 시점이나 달력 종류에 독립적으로 특정 시점의 시간을 알 수 있다고 써있네여.
저는 Date 구조체에서 특정 날짜의 연/월/일/요일/그 달의 날수(31일까지 있는지, 30일까지 있는지 ... )/그달의 1일이 무슨 요일인지/윤년인지 등등이 필요했어요.
그래서 extension을 이용해 Date구조체에서 내가 원하는 정보를 쉽게 받을 수 있게 커스텀을 해보았습니다.
먼저 Calendar구조체를 이용해 현재 Date 구조체에서 원하는 요소를 추출해서 리턴해주었어요.
extension Date {
public var year: Int {
return Calendar.current.component(.year, from: self)
}
public var month: Int {
return Calendar.current.component(.month, from: self)
}
public var day: Int {
return Calendar.current.component(.day, from: self)
}
public var weekday: Int{
return Calendar.current.component(.weekday, from: self) - 1
}
...
}
그리고 달력을 그리기 위해서 필요한, 특정 날짜가 윤년인지, 그 달에 며칠까지 있는지, 그 달의 첫날이 무슨 요일인지의 값을 구해서 리턴해줍니다.
extension Date{
...
public var isLeapMonth: Bool{
if year % 400 == 0 || (year % 4 == 0 && year % 100 != 0){
return true
}
else{
return false
}
}
public var numberOfMonth: Int{
let numberList = [0,31,28,31,30,31,30,31,31,30,31,30,31]
if isLeapMonth && month == 2{
return 29
}
else{
return numberList[month]
}
}
public var firstWeekday: Int{
var dateComponent = DateComponents()
dateComponent.year = Calendar.current.component(.year, from: self)
dateComponent.month = Calendar.current.component(.month, from: self)
dateComponent.day = 1
dateComponent.weekday = Calendar.current.component(.weekday,from: Calendar.current.date(from: dateComponent)!)
/// 리턴값 : 일 - 토 -> 0 - 6
return dateComponent.weekday! - 1
}
...
}
제가 썼던 코드로 예시를 보여드릴게요.
- selectedDate가 특정 날짜의 Date 객체
- Date()로 현재 날짜의 객체
두 객체의 커스텀된 프로퍼티를 이용해 collectionView에 dataSource를 넣어주는 코드 중 일부인데요,
위에는 없지만 현재 연도와 월을 알려주는 프로퍼티인 currentYearMonth, 그 달의 첫 날이 무슨 요일인지 알려주는 프로퍼티인 firstWeekday 프로퍼티를 이용해 달력에 필요한 계산을 진행했어요.
이렇게 extension을 이용해서 반복적으로 필요한 연산들을 정리해서 사용할 수 있었습니다.
이 포스팅에서는 Calendar나 DateFormatter에 대한 설명은 없었는데,
시간이 된다면 그 내용도 추가해보도록 하겠습니다 >,<
질문이 있거나, 오류가 있으면 댓글로 알려주세요 감사합니다!
'iOS' 카테고리의 다른 글
[iOS] UIPanGestureRecognizer 알아보기 (드로어 구조 만들기) (2) | 2021.03.07 |
---|---|
[iOS] 아이폰에서 URL, 이메일 열기 (0) | 2021.02.28 |
[iOS] NotificationCenter 사용법 (0) | 2021.02.07 |