iOS

[iOS] Date 구조체를 이용해 캘린더 만들기 - 1 (extension 이용하기)

seu11ee 2021. 2. 14. 23:13

안녕하세요 ! :)

 

이번 포스팅에서는 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에 대한 설명은 없었는데,

 

시간이 된다면 그 내용도 추가해보도록 하겠습니다 >,<

 

질문이 있거나, 오류가 있으면 댓글로 알려주세요 감사합니다!