33기 SOPT 합동세미나에서 내가 맡은 서비스는 LongBlack이다.
LongBlack은 하루에 하나씩 아티클을 제공하기 때문에 아티클을 읽을 수 있는 시간을 나타내는 부분이 있었다.
처음에는 DateFormatter()를 사용해서 구현해줘야 한다고 생각했는데, 1초마다 실시간으로 시간이 바뀌어야 했기 때문에 Timer로 바꿔 구현해주었다.
코드는 생각보다 간단~
// 타이머 생성
private var homeTimer: Timer?
override func viewDidLoad() {
super.viewDidLoad()
// 1초 간격으로 Timer를 불러옴
self.homeTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(updateTime), userInfo: nil, repeats: true)
}
deinit {
// 타이머 해제
homeTimer?.invalidate()
}
// 시간 업데이트 메소드
@objc private func updateTime() {
// 오늘 날짜
let currentDate = Date()
let calendar = Calendar.current
// 오늘의 마지막 시간 (23시 59분 59초까지 얼마나 남았는지 계산하기 위해)
guard let endOfDay = calendar.date(bySettingHour: 23, minute: 59, second: 59, of: currentDate) else { return }
// 남은 시간 계산
let components = calendar.dateComponents([.hour, .minute, .second], from: currentDate, to: endOfDay)
// 보여주기 위한 포맷 설정
let formattedTime = String(format: "%02d : %02d : %02d", components.hour ?? 0, components.minute ?? 0, components.second ?? 0)
// 텍스트에 넣어줌
timeLabel.text = formattedTime
}
여기서 "%02d : %02d : %02d"란 문자열을 포맷하는 방법 중 하나로, 정수값을 두 자리로 표시하며, 한 자리 숫자라면 0을 붙이는 방식을 의미한다.
예시
1시간 5분 28초 -> 01:05:28