sample 기능을 활용할 때 불편한 점이 있습니다. sample은 같은 단어를 입력했을 때 기존에 저장되어 있던 한자와 가나를 검색해서 보여주는 기능인데요. 이미 저장되어 있지만 다시 한번 공부하고 싶은 단어를 저장할 때 유용한 기능입니다. 다만 이 기능을 활용할 때 한자 field는 비어 있고 가나 field에 한자와 가나가 모두 저장된 단어가 sample의 최상단에 위치해서 다른 sample을 선택하기 위해서 Picker를 조작해야 하는 경우가 많았습니다.
이 단어장의 초창기에는 한자와 가나 기능이 분리되어 있지 않았습니다. 즉 뜻과 가나 둘 밖에 없었습니다. 그 당시에 저장된 단어들은 아래 before의 맨 위에 있는 샘플처럼 가나 field에 한자와 뜻이 동시에 저장되어 있었습니다.
이번 포스팅에서는 정렬 메소드인 sorted를 활용해서 한자가 있는 sample들을 Picker의 상단에 위치할 수 있도록 해보겠습니다.
보통 정렬 메소드인 sorted를 사용할 때는 <이나 >를 통해서 정렬의 기준인 오름차순이나 내림차순을 전달하는 경우가 많습니다. 하지만 sorted는 그것보다 더 복잡한 정렬을 실시할 때도 활용할 수 있습니다.
sorted의 경우 클로저를 parameter로 받을 수 있는데 이 클로저는 2개의 parameter를 가지고 Bool을 리턴하는 클로저입니다. 해당 클로저는 2개의 parameter 중에 첫 번째 parameter가 먼저 위치해야 할 때 true를 두 번째 parameter가 먼저 위치해야 할 때 false를 리턴하면 됩니다.
아래 코드를 예시로 보도록 하겠습니다. sorted에 전달된 클로저는 ex1과 ex2라는 두 개의 parameter를 가집니다. 각각의 parameter는 배열 samples의 원소인 Sample 타입입니다. ex1의 kanjiText가 비어 있지 않고 ex2의 kanjiText가 비어 있는 경우 true를 리턴하는 경우 kanjiText가 비어있지 않은 Sample이 더 먼저 위치하게 됩니다. 그 반대의 경우에는 false를 리턴하면 됩니다.
설명드린대로 첫 번째 parameter인 ex1이 먼저 위치해야 하는 경우 true, 반대로 두 번째 parameter인 ex2가 먼저 위치해야 하는 경우 false를 리턴한다는 것만 기억하면 됩니다.
@Published private(set) var samples: [Sample] = []
func getExamples() {
sampleService.getSamples(meaningText) { [weak self] examples, error in
if let error = error { print(error); return }
guard let examples = examples else { print("examples are nil"); return }
// example의 이미지는 View에 보여줄 수 없으므로 일단 image 있는 것은 필터링
self?.samples = examples
.filter({ !$0.hasImage })
//✅ 정렬 부분
.sorted { ex1, ex2 in
if !ex1.kanjiText.isEmpty && ex2.kanjiText.isEmpty {
return true
} else {
return false
}
}
if !examples.isEmpty { self?.selectedSampleID = self?.samples[0].id }
}
}