본문 바로가기
Swift

정렬과 중복 제거가 가능한 모델

by songmoro 2025. 8. 30.

 

검색 기록과 같은 모델은 시간 순에 따라 정렬이 가능해야 하며, 동시에 중복 검색을 방지를 위한 Hashable이 필요할 수 있다.

struct Keyword: Codable {
    let text: String
    let date: Date

    init(text: String, date: Date = Date()) {
        self.text = text
        self.date = date
    }
}

 

 

Keyword가 정렬, Set을 지원하기 위해선 Hashable과 Comparable을 채택할 수 있다.

extension Keyword: Hashable {
    func hash(into hasher: inout Hasher) {
        hasher.combine(text)
    }

    static func ==(lhs: Keyword, rhs: Keyword) -> Bool {
        lhs.text == rhs.text
    }
}

extension Keyword: Comparable {
    static func < (lhs: Keyword, rhs: Keyword) -> Bool {
        lhs.date < rhs.date
    }
}

 

 

Keyword의 해시 밸류를 text만 기준으로 하여 시간에 상관없이 text로 중복을 제거할 수 있고, 비교 연산에선 date를 기준으로 하여 시간에 따른 정렬을 지원하게 한다.

class ViewController: UIViewController {
    let keywords: Set<Keyword> = [
        .init(text: "q", date: .init(timeIntervalSinceNow: 10)),
        .init(text: "w", date: .init(timeIntervalSinceNow: 11)),
        .init(text: "e", date: .init(timeIntervalSinceNow: 12)),
        .init(text: "r", date: .init(timeIntervalSinceNow: 13)),
        .init(text: "t", date: .init(timeIntervalSinceNow: 12)),
        .init(text: "r", date: .init(timeIntervalSinceNow: 11)),
        .init(text: "r", date: .init(timeIntervalSinceNow: 10)),
    ]


    override func viewDidLoad() {
        super.viewDidLoad()

        print("set", keywords)
        print()
        print("sorted", keywords.sorted())
    }
}

 

 

  • 결과
    • set: 중복이 제거됨
    • set -> sorted: 시간 순으로 정렬됨

 

샘플 프로젝트

https://github.com/songmoro/SetAndSort

'Swift' 카테고리의 다른 글

Swift: 동시성 코드 작성 노하우  (1) 2025.12.02
Swift: CORS Error  (0) 2025.11.17
struct Error vs. enum Error  (1) 2025.08.18
Swift: class func, static func, func  (0) 2025.07.20
Swift: print가 값을 출력하는 방법  (1) 2025.07.13