Swift 5.0 유니코드 스칼라 프로퍼티 추가 (Unicode Scalar Properties) SE-0211

안녕하세요~! Swift 5.0에서 Unicode Scalar에 properties가 추가 되었는데요

어떤 특징들이 있는지 함께보시죠~!

 

들어가기 앞서 유니코드 스칼라 의미 잠깐 보고 가시죠~!

유니코드 문자에 배당된 숫자를 의미 합니다

"U+" + 16진수 형태로 구성 되어있구요 U+0000부터 U+D7FF까지, U+E000부터 U+10FFFF까지의 값이 있습니다

 

1. 유니코드 속성 검사 Bool 값 추가 

scalar properties 에서 제공하는 여러 Bool 값을 이용해서 어떤 문자가 포함 되어있는지 확인 할 수 있습니다.

isMath, isUppercase, isASCIIHexDigit...

 

let question = "Which is larger, 3 * 3 * 3 or 10 + 10 + 10?"
let hasMathSymbols = question.unicodeScalars.contains(where: {
    $0.properties.isMath
})

print(hasMathSymbols)

let name = #"Alice", "bob", "dabel"#
print (name.unicodeScalars.first?.properties.isUppercase ?? "")

 

2. 유니코드 공식 이름, 버전, 카테고리 추출 가능

특정 유니코드의 공식 이름을 알아 낼 수 있습니다.

print ( "👨❤️👩🍋🥨🎉_n".unicodeScalars.compactMap { $0.properties.name })
print ( "👨❤️👩🍋🥨🎉_n".unicodeScalars.compactMap { $0.properties.age })
print ( "👨❤️👩🍋🥨🎉_n".unicodeScalars.compactMap { $0.properties.generalCategory })

결과 값:

["MAN", "HEAVY BLACK HEART", "VARIATION SELECTOR-16", "WOMAN", "LEMON", "PRETZEL", "PARTY POPPER", "LOW LINE", "LATIN SMALL LETTER N"]

[(major: 6, minor: 0), (major: 1, minor: 1), (major: 3, minor: 2), (major: 6, minor: 0), (major: 6, minor: 0), (major: 10, minor: 0), (major: 6, minor: 0), (major: 1, minor: 1), (major: 1, minor: 1)]

[Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.nonspacingMark, Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.otherSymbol, Swift.Unicode.GeneralCategory.connectorPunctuation, Swift.Unicode.GeneralCategory.lowercaseLetter]

 

 

3. 유니코드 숫자 유형 판단하기

아래 유니코드값이 숫자 타입인지 체크 할 수 있습니다.

let scalars: [Unicode.Scalar] = ["4", "④", "⅕", "X"]
for scalar in scalars {
    print(scalar, "-->", scalar.properties.numericType)
}
// 4 --> Optional(Swift.Unicode.NumericType.decimal)
// ④ --> Optional(Swift.Unicode.NumericType.digit)
// ⅕ --> Optional(Swift.Unicode.NumericType.numeric)
// X --> nil

 

 

참조:

https://github.com/apple/swift-evolution/blob/main/proposals/0211-unicode-scalar-properties.md

https://developer.apple.com/documentation/swift/unicode/scalar/properties-swift.struct/numerictype