2017-04-06 1 views
1

내가하고 싶은 일은 String으로 변환 한 다음 .uppercased()을 호출하는 오버 헤드없이 단일 Character을 대문자로 변환하는 것입니다. 이 작업을 수행 할 수있는 기본 제공 방법이 있습니까? 아니면 toupper() 함수를 브리징없이 C에서 호출 할 수 있습니까? 나는 정말로 그렇게 단순한 것을 위해 나가야 만한다고 생각하지 않는다.단일 문자 유형을 대문자로 변환하려면 어떻게해야합니까?

+5

을 당신이 문자열을 통해 갈 필요가 생각합니다. 또한 단일 문자의 대문자 버전은 여러 문자가 포함 된 문자열 일 수 있습니다 (예 : "ß"- "SS". –

+0

또한'toupper()'는'char'에서만 작동하며 로케일에 의존합니다. –

+0

다른 예 : "ffi"(합자) -> "FFI". 또는 "ᾀ"(일부 그리스 문자) -> "ἈΙ" –

답변

3

C toupper()을 호출하려면 유니 코드 코드 포인트를 Character으로 가져와야합니다. 그러나 Character에는 코드 포인트를 가져 오는 방법이 없습니다 (Character은 여러 코드 포인트로 구성 될 수 있습니다). Character을 코드 포인트를 얻기 위해 String으로 변환해야합니다.

그래서 어디서나 이동하려면 실제로 String으로 변환해야합니다. 문자를 Character 대신 UnicodeScalar으로 저장하지 않는 한.

assert(unicodeScalar.isASCII) // toupper argument must be "representable as an unsigned char" 
let uppercase = UnicodeScalar(toupper(CInt(unicodeScalar.value))) 

을하지만이 정말 간단 String을 사용하는 것보다 더 읽을 수 없습니다 :이 경우이 작업을 수행 할 수

let uppercase = Character(String(character).uppercased()) 
+2

런타임시 마지막 줄이 깨질 수 있습니다. 'character = "ß"'(이 미친 독일인들) : –

관련 문제