验证Swift中的Unicode代码点

验证Swift中的Unicode代码点,swift,unicode,Swift,Unicode,我正在用Swift编写一个例程,需要尝试将任意整数转换为UnicodeScalar或返回错误。构造函数UnicodeScalar(u:Int)为有效代码点执行此任务,但当传递的整数不是有效代码点时,它会崩溃 是否有一个Swift(或基础)函数可以在飞行前调用,以确保整数I是一个有效的Unicode码点,并且不会导致UnicodeScalar(I)崩溃?状态 Unicode标量是U+0000到U+0000范围内的任何Unicode代码点 U+D7FF(含)或U+E000至U+10FFFF(含) 对

我正在用Swift编写一个例程,需要尝试将任意整数转换为UnicodeScalar或返回错误。构造函数
UnicodeScalar(u:Int)
为有效代码点执行此任务,但当传递的整数不是有效代码点时,它会崩溃

是否有一个Swift(或基础)函数可以在飞行前调用,以确保整数
I
是一个有效的Unicode码点,并且不会导致
UnicodeScalar(I)
崩溃?

状态

Unicode标量是U+0000到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)
    }
}
分机{
初始化?(代码:Int){

警卫(代码>=0&&code=0xE000&&codeSwift 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
    }
}
(使用来自

好的问题和解决方案!为了完整起见,我提供了另一个答案。该功能现在是Swift 3的“内置”功能,请参见下文。
GeneratorOfOne(code)
略优于
[code]。generate()