我如何处理字符串.编码初始化器永远不会失败?


if let encoding = String.Encoding(rawValue: 999) {
// ...
}

产生编译器错误,提示"条件绑定的初始化项必须为Optional类型,而不是'String.Encoding'"因为尽管文档说字符串。编码初始化器是可失败的,否则它将很高兴地创建不存在的编码。

如何检查初始化器返回的编码是否为实际编码?

我的两个想法是

  1. 检查字符串。编码描述不为空。这假定支持的编码必须有一个描述
  2. 编码一些东西-例如"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 {
// ...
}

相关内容

  • 没有找到相关文章

最新更新