【发布时间】:2015-07-29 07:03:17
【问题描述】:
我正在用 Swift 编写一个例程,它需要尝试将任意整数转换为 UnicodeScalar 或返回错误。构造函数UnicodeScalar(_:Int) 为有效代码点完成工作,但在传递无效代码点的整数时会崩溃。
是否有一个 Swift(或 Foundation)函数我可以在飞行前调用整数 i 是一个有效的 Unicode 代码点并且不会导致 UnicodeScalar(i) 崩溃?
【问题讨论】:
我正在用 Swift 编写一个例程,它需要尝试将任意整数转换为 UnicodeScalar 或返回错误。构造函数UnicodeScalar(_:Int) 为有效代码点完成工作,但在传递无效代码点的整数时会崩溃。
是否有一个 Swift(或 Foundation)函数我可以在飞行前调用整数 i 是一个有效的 Unicode 代码点并且不会导致 UnicodeScalar(i) 崩溃?
【问题讨论】:
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。)
【讨论】:
GeneratorOfOne(code) 略好于[code].generate()
Unicode 标量是 U+0000 到范围内的任何 Unicode代码点 U+D7FF(含)或 U+E000 到 U+10FFFF(含)。
UnicodeScalar 构造函数不会在 Swift 2.0b4 中对这些范围内的所有值崩溃。我使用这个方便的构造函数:
extension UnicodeScalar {
init?(code: Int) {
guard (code >= 0 && code <= 0xD7FF) || (code >= 0xE000 && code <= 0x10FFFF) else {
return nil
}
self.init(code)
}
}
【讨论】: