我在Swift中编写一个例程,需要尝试将任意整数转换为UnicodeScalar或返回错误。构造函数UnicodeScalar(_:Int)
为有效的代码点完成工作,但是当传递的函数不是有效代码点时,它会崩溃。
是否有一个Swift(或Foundation)函数我可以调用pre-flight,整数i
是一个有效的Unicode代码点,不会导致UnicodeScalar(i)
崩溃?
答案 0 :(得分:3)
Swift 3的更新:
UnicodeScalar
现在有一个可用的初始化程序,用于验证是否存在
给定的数字是否是有效的Unicode代码点:
if let unicode = UnicodeScalar(0xD800) {
print(unicode)
} else {
print("invalid")
}
(上一个答案:)您可以使用内置的UTF32()
编解码器来检查给定的整数
是一个有效的Unicode标量:
extension UnicodeScalar {
init?(code: UInt32) {
var codegen = GeneratorOfOne(code) // As suggested by @rintaro
var utf32 = UTF32()
guard case let .Result(scalar) = utf32.decode(&codegen) else {
return nil
}
self = scalar
}
}
(使用来自https://stackoverflow.com/a/24757284/1187415的提示 和https://stackoverflow.com/a/31285671/1187415。)
答案 1 :(得分:2)
Unicode标量是U + 0000到的范围内的任何Unicode 代码点 U + D7FF包含或U + E000到U + 10FFFF包含。
对于Swift 2.0b4中这些范围内的所有值,UnicodeScalar构造函数不会崩溃。我使用这个方便的构造函数:
extension UnicodeScalar {
init?(code: Int) {
guard (code >= 0 && code <= 0xD7FF) || (code >= 0xE000 && code <= 0x10FFFF) else {
return nil
}
self.init(code)
}
}