본문 바로가기
AI 해보기/딸깍! 일정관리 앱 만들어보기

7. 기간 필터와 정렬

by yoondoo 2026. 3. 20.
728x90

0. 이전 -> 현재

  • 카테고리만 필터링 -> 기간도 필터링
  • 추가한 순서대로 표시 -> 원하는 순서로 정렬
  • 단일 필터 -> 필터 조합(기간 + 카테고리)

1. 날짜 계산기 Calendar

  • 오늘이 며칠인지 계산
  • 이번 주의 시작/끝 계산
  • 이번 달의 범위 계산
  • 날짜 비교(과거/미래)
let cal = Calendar.current
let today = cal.startOfDay(
	for: Date()
)

// 이번 주 시작
let weekStart = cal.dateInterval(
	of: .weekOfYear,
    for: today
)?. start

// 이번 달 시작
let monthStart = cal.dateInterval(
	of: .month,
    for: today
)?.start
  • startOfDay: 시간을 00:00:00으로 맞춤 (날짜만 비교)
  • dateInterval: 주/월의 시작과 끝을 자동 계산
  • 한국은 주 시작이 일요일 (바꿀 수 있음)

2. 기간별 필터링

enum TimePeriod {
	case all, today, week, month
}

var filtered: [Event] {
	switch selectedPeriod {
    case .all: return events
    case .today:
    	return events.filter {
        	cal.isDateInToday($0.date)
        }
    case .week:
    	return events.filter {
        	$0.date >= weekStart &&
            $0.date < weekEnd
        }
    }
    case .month:
    	// 이번 달 범위 내
}

카테고리 + 기간 = AND 조건이 된다!

// "이번 주 업무 일정만 표시"
events
	.filter { 카테고리 == .work } // 1차 : 업무 카테고리만
    .filter { 날짜가 이번주 }		 // 2차 : 이번 주만

3. 원하는 순서로 정렬 .sorted

  • 오름차순
    • A -> Z, 과거 -> 미래, 1 -> 9
  • 내림차순
    • Z -> A, 미래 -> 과거, 9 -> 1
  • 원본은 바뀌지 않음!!!
// 날짜순 (오름차순)
events.sorted {
	$0.date < $1.date
}

// 날짜순 (내림차순)
events.sorted {
	$0.date > $1.date
}

// 제목순 (가나다순)
events.sorted {
	$0.title < $1.title
}
  • 4. 필터 체이닝, 연속 적용 !
  • 두 조건을 "모두" 만족하는 일정만 표시
  • filter를 연속으로 걸면 AND 조건

전체 흐름

var result: [Event] {
	var list = events
    
    //1. 카테고리 필터
    if let cat = selectedCategory {
    	list = list.filter {
        	$0.category == cat
        }
    }
    
    //2. 기간 필터
    list = applyPeriodFilter(list)
    
    //3. 정렬
    list = list.sorted {
    	$0.date < $1.date
    }
    
    return list
}

4. 실행 체크

  • [ㅇ] 다양한 날짜의 테스트 일정을 만들었다
  • [ㅇ] 모든 기간 필터를 테스트했다
  • [ㅇ] 날짜순, 제목순 정렬을 테스트했다
  • [ㅇ] 기간 + 카테고리 조합을 테스트했다
반응형

댓글