2017-04-06 95 views
1

我想要做的就是将单个Character转换为大写,而无需转换为String然后调用.uppercased()的开销。有没有任何内置的方式来做到这一点,或者我有一种方法让我从C中调用toupper()函数而无需任何桥接?我真的不认为我应该为了这么简单的事情而走出困境。如何将单个字符类型转换为大写?

+5

我认为你必须通过串去。单个字符的大写版本也可以是具有多个字符的字符串,例如, “ß” - >“SS”。 –

+0

'toupper()'只在'char'上运行,并且依赖于语言环境。 –

+0

另一个例子:“ffi”(连字) - >“FFI”。或“ᾀ”(某些希腊字母) - >“ἈΙ” –

回答

3

要调用C toupper(),您需要获取Character的Unicode代码点。但Character没有获取其代码点的方法(Character可能包含多个代码点),因此您必须将Character转换为String以获取其任意代码点。

所以你真的必须转换为String才能找到任何地方。除非您将角色存储为UnicodeScalar而不是Character。在这种情况下,你可以这样做:

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 =“ß”'(这些疯狂的德国人:) –