if let encoding = String.Encoding(rawValue: 999) {
// ...
}
产生编译器错误,提示"条件绑定的初始化项必须为Optional类型,而不是'String.Encoding'"因为尽管文档说字符串。编码初始化器是可失败的,否则它将很高兴地创建不存在的编码。
如何检查初始化器返回的编码是否为实际编码?
我的两个想法是
- 检查字符串。编码描述不为空。这假定支持的编码必须有一个描述
- 编码一些东西-例如
"abc".data(using: encoding) == nil
-它假设字符串"abc"可以用所有支持的编码进行编码
文档是误导的,String.Encoding
有一个不可失败的
public init(rawValue: UInt)
初始化器。所有有效字符串编码的列表是String.availableStringEncodings
,所以你可以用它来检查有效性:
let encoding = String.Encoding(rawValue: 999)
print(String.availableStringEncodings.contains(encoding)) // false
你可以使用CoreFoundation的CFStringIsEncodingAvailable()函数来检查编码是否有效,以及它是否可以在特定的设备上使用。
然而,正如MartiR指出的那样,CFStringIsEncodingAvailable
需要CFStringEncoding
来工作,因此String.Encoding
需要首先转换为CF。
let encoding = String.Encoding(rawValue: 999)
let cfEncoding = CFStringConvertNSStringEncodingToEncoding(encoding.rawValue)
if CFStringIsEncodingAvailable(cfEncoding) {
// ...
}
,或者,正如MartinR所建议的,CFStringConvertNSStringEncodingToEncoding
的结果也可以使用:
if CFStringConvertNSStringEncodingToEncoding(encoding.rawValue) != kCFStringEncodingInvalidId {
// ...
}