Date 타입에 두 가지 계산 속성(computed properties)을 추가하여 날짜와 시간을 특정 형식의 문자열로 변환하는 기능을 제공
extension Date {
var dayAndTimeText: String {
let timeText = formatted(date: .omitted, time: .shortened)
if Locale.current.calendar.isDateInToday(self) {
let timeFormat = NSLocalizedString("Today at %@", comment: "Today at time format string")
return String(format: timeFormat, timeText)
} else {
let dateText = formatted(.dateTime.month(.abbreviated).day())
let dateAndTimeFormat = NSLocalizedString("%@ at %@", comment: "Date and time format string")
return String(format: dateAndTimeFormat, dateText, timeText)
}
}
var dayText: String {
if Locale.current.calendar.isDateInToday(self) {
return NSLocalizedString("Today", comment: "Today due date description")
} else {
return formatted(.dateTime.month().day().weekday(.wide))
}
}
}
각 부분의 상세 설명
1. extension Date
Swift의 extension 키워드를 사용하여 기존의 Date 타입에 새로운 기능을 추가합니다. 이 경우, 두 가지 계산 속성(dayAndTimeText와 dayText)을 추가하여 날짜와 시간을 특정 형식의 문자열로 변환할 수 있게 합니다.
2. var dayAndTimeText: String
이 속성은 Date 객체를 "오늘"인지 여부에 따라 다른 형식의 문자열로 변환합니다.
- 시간 텍스트 생성:
let timeText = formatted(date: .omitted, time: .shortened)
formatted 메서드를 사용하여 날짜 부분은 생략하고(time 부분만), 시간을 단축 형식으로 포맷팅합니다. 예를 들어, "3:00 PM"과 같은 형식입니다.
- 오늘인지 확인:
if Locale.current.calendar.isDateInToday(self) {
현재 날짜(self)가 오늘인지 확인합니다. Locale.current.calendar는 현재 로케일의 달력을 사용하여 날짜를 확인합니다.
- 오늘인 경우:
let timeFormat = NSLocalizedString("Today at %@", comment: "Today at time format string")
return String(format: timeFormat, timeText)
NSLocalizedString을 사용하여 "Today at %@" 형식의 문자열을 가져옵니다. 이는 현지화된 문자열로, %@는 시간 텍스트가 삽입될 자리입니다. 예를 들어, "오늘 오후 3:00"과 같은 형식으로 반환됩니다.
- 오늘이 아닌 경우:
let dateText = formatted(.dateTime.month(.abbreviated).day())
let dateAndTimeFormat = NSLocalizedString("%@ at %@", comment: "Date and time format string")
return String(format: dateAndTimeFormat, dateText, timeText)
날짜를 "월 약어"와 "일" 형식으로 포맷팅합니다. 예를 들어, "Oct 8". 그런 다음, "Oct 8 at 3:00 PM"과 같이 날짜와 시간을 결합한 문자열을 반환합니다. 이 역시 NSLocalizedString을 사용하여 현지화된 형식을 적용합니다.
3. var dayText: String
이 속성은 Date 객체의 날짜 부분을 특정 형식의 문자열로 변환합니다.
- 오늘인지 확인:
if Locale.current.calendar.isDateInToday(self) {
return NSLocalizedString("Today", comment: "Today due date description")
}
날짜가 오늘이면 "Today"라는 현지화된 문자열을 반환합니다.
- 오늘이 아닌 경우:
return formatted(.dateTime.month().day().weekday(.wide))
- 날짜를 "월", "일", "요일" 형식으로 포맷팅합니다. 예를 들어, "October 8, Monday"와 같은 형식입니다. 현지화된 형식이 적용됩니다.
추가 설명
- 현지화(Localization):
- NSLocalizedString 함수는 앱이 여러 언어를 지원할 수 있도록 문자열을 현지화하는 데 사용됩니다. 이 코드는 "Today at %@" 및 "%@ at %@" 형식을 현지화하여 다양한 언어와 문화권에 맞는 날짜 및 시간 표현을 제공합니다.
- formatted 메서드:
- Swift의 formatted 메서드는 Date를 특정 형식으로 문자열로 변환하는 편리한 방법입니다. .dateTime 옵션을 사용하여 필요한 날짜 및 시간 구성 요소를 지정할 수 있습니다. 예를 들어, .omitted는 해당 부분을 생략하고, .shortened는 짧은 형식으로 표시합니다.
- Locale.current.calendar.isDateInToday:
- 현재 로케일의 달력을 사용하여 날짜가 오늘인지 확인하는 메서드입니다. 이는 로케일에 따라 달력이 다를 수 있는 경우에도 올바르게 동작하도록 보장합니다.
예시
다음은 이 확장 속성을 사용하는 예시입니다:
let now = Date()
print(now.dayAndTimeText) // 예: "Today at 3:00 PM" 또는 현지화된 형식
print(now.dayText) // 예: "Today" 또는 현지화된 형식
let someDate = Calendar.current.date(byAdding: .day, value: 1, to: now)!
print(someDate.dayAndTimeText) // 예: "Oct 9 at 3:00 PM" 또는 현지화된 형식
print(someDate.dayText) // 예: "Monday, Oct 9" 또는 현지화된 형식
'iOS > Swift' 카테고리의 다른 글
let title = "\(String(describing: model.title)) + 방문"여기서 왜 String(describing으로 감싼거야?그냥 "\(model.title) + 방문" 하면 안돼? (1) | 2024.10.05 |
---|---|
compactMap - 새로운 배열 생성 (1) | 2024.09.21 |
공공 API를 통해 데이터를 가져오는 중에 발생한 오류 해결 (1) | 2024.09.21 |
위치정보를 받아오는 방법 (0) | 2024.09.18 |
heightAnchor랑 bottomAnchor는 뭐가 다를까? (0) | 2024.09.06 |