이슈
- ‘을/를’ 등의 조사를 구분해서 노출하는 스펙 필요
해결
- 한글의 유니코드 값을 이용하여, 마지막 글자에 종성(받침)이 있는지 확인이 가능함
- 마지막 글자의 종성 유무에 따라 ‘을/를’ 구분 하여 적용 가능
/*
* 한글 음절 문자 집합 (가-힣) : CharacterSet(charactersIn: "\u{ac00}"..."\u{d7a3}")
* 초성: ((한글 유니코드 값 - 0xAC00 / 28) / 21)
* 중성: ((한글 유니코드 값 - 0xAC00 / 28) % 21)
* 종성: (한글 유니코드 값 - 0xAC00 % 28)
*/
public extension String {
func koreanPostPositionText() -> String {
guard let lastText = self.last else {
return self
}
guard let unicode = UnicodeScalar(String(lastText)) else {
return self
}
let postStr = hasKoreanSyllablesJongSung(unicode) ? "을" : "를"
return self + postStr
}
}
private extension String {
private func isKoreanSyllables(_ unicode: UnicodeScalar) -> Bool {
return CharacterSet.koreanSyllables.contains(unicode)
}
private func hasKoreanSyllablesJongSung (_ unicode: UnicodeScalar) -> Bool {
return isKoreanSyllables(unicode) && (unicode.value - 0xAC00) % 28 > 0
}
}
private extension CharacterSet {
static var koreanSyllables : CharacterSet {
get {
struct Static {
static let characterSet = CharacterSet(charactersIn: "\u{ac00}"..."\u{d7a3}")
}
return Static.characterSet
}
}
}
Reference
Leave a comment