- DataStore: App Group 컨테이너의 HaruDanim.store 사용, 기존 default.store 1회 자동 이관 - 프리미엄 + 동기화 토글 시 CloudKit(.private) 구성으로 컨테이너 생성, 실패하면 로컬 폴백 - CloudKit 요건(모든 관계 optional)에 맞춰 to-many 관계를 optional 저장 + 기존 이름 접근자로 리팩터링 (originalName 매핑으로 기존 데이터 유지) - Tag/Action/Goal/Quest에 uuid 추가 (시리 단축어·위젯·워치 식별자) + 중복 보정 - 모델 레이어(Models/Settings/DayMath/QuestProgress/Formatters/Theme)를 Shared/로 이동 — 위젯 확장과 공유 - 집계 설정(주 시작 요일·하루 시작 시간·대표 시간·짧은 기록 무시)을 App Group defaults로 이관해 위젯·워치와 공유, 설정의 '기기 간 동기화' 토글 활성화 - Goal.combinedSpanRatio 공용화 (모음 탭 카드·위젯·시리가 동일 산식 사용) - DEBUG 검증 인자: -cloudSync YES, -settingsScrollPremium YES Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013yKDMhuF39GVYy3FMcGHh7
53 lines
1.5 KiB
Swift
53 lines
1.5 KiB
Swift
//
|
|
// Formatters.swift
|
|
// Haru_Danim
|
|
//
|
|
|
|
import Foundation
|
|
|
|
enum Format {
|
|
/// 1:23:45 또는 23:45 형식 (진행 중 타이머용)
|
|
static func timer(_ interval: TimeInterval) -> String {
|
|
let total = Int(interval.rounded(.down))
|
|
let h = total / 3600
|
|
let m = (total % 3600) / 60
|
|
let s = total % 60
|
|
if h > 0 { return String(format: "%d:%02d:%02d", h, m, s) }
|
|
return String(format: "%d:%02d", m, s)
|
|
}
|
|
|
|
/// "2시간 30분" / "45분" / "30초" 형식
|
|
static func durationShort(_ interval: TimeInterval) -> String {
|
|
let total = Int(interval.rounded())
|
|
let h = total / 3600
|
|
let m = (total % 3600) / 60
|
|
if h > 0 {
|
|
return m > 0 ? "\(h)시간 \(m)분" : "\(h)시간"
|
|
}
|
|
if m > 0 { return "\(m)분" }
|
|
return "\(total)초"
|
|
}
|
|
|
|
static func weekdayShort(_ weekday: Int) -> String {
|
|
let names = ["일", "월", "화", "수", "목", "금", "토"]
|
|
let index = (weekday - 1) % 7
|
|
return names[max(0, index)]
|
|
}
|
|
|
|
static func shortDate(_ date: Date) -> String {
|
|
date.formatted(.dateTime.month(.defaultDigits).day())
|
|
}
|
|
|
|
static func fullDate(_ date: Date) -> String {
|
|
date.formatted(.dateTime.year().month().day().weekday(.short))
|
|
}
|
|
|
|
static func time(_ date: Date) -> String {
|
|
date.formatted(.dateTime.hour().minute())
|
|
}
|
|
|
|
static func percent(_ ratio: Double) -> String {
|
|
"\(Int((ratio * 100).rounded()))%"
|
|
}
|
|
}
|