在[UInt8]数组或Data中包含UTF8字符文字



我想要类似的东西:

let a = ["v".utf8[0], 1, 2]

我发现的最接近的是:

let a = [0x76, 1, 2]

"v".data(using: String.Encoding.utf8)! + [1, 2]

注意:[UInt8]Data都是可接受的类型。

StringUTF8View不是由Int索引的,而是由它自己的String.UTF8View.Index类型索引的,因此,为了在数组文字中包含给定字符串的UTF-8序列的第一个字节,可以使用它的first属性:

let a = ["v".utf8.first!, 1, 2] // [118, 1, 2]

如果序列中有多个字节,您可以简单地使用+运算符将UTF-8字节与数组文字连接起来:

let a = "😀".utf8 + [1, 2] // [240, 159, 152, 128, 1, 2]

还要注意,将[UInt8]连接到Data的示例可以稍微缩短为:

let a = "v".data(using: .utf8)! + [1, 2] // Data with bytes [0x76, 0x1, 0x2]

有一个特定的UInt8初始值设定项(在Swift 2.2+中引入):

let a = [UInt8(ascii:"v"), 1 ,2]

(已经发布的答案的一些附录;特别是关于UnicodeScalar的)


在您的问题中,您使用了文字"v"作为要转换为UInt8的基本实例;我们真的不知道在您的实际用例中这是String还是例如UnicodeScalar。接受的答案显示了一些巧妙的方法,以防您使用String实例。


如果您碰巧使用UnicodeScalar实例(而不是String),一个答案已经提到了UInt8init(ascii:)初始值设定项。但是,您应该注意验证此初始化器中使用的UnicodeScalar实例是否确实适合ASCII字符编码;大多数CCD_ 23值将不会(这将导致该初始化器的运行时执行)。在使用初始值设定项之前,您可以使用例如UnicodeScalarisASCII属性来验证这一事实。

let ucScalar: UnicodeScalar = "z"
var a = [UInt8]()
if ucScalar.isASCII {
a = [UInt8(ascii: ucScalar), 1, 2]
}
else {
// ... unexpected but not a runtime error
}

另一种方法是使用UTF8:的encode(_:into:)方法,以防您想将完整的UnicodeScalar编码为UInt8格式(即使对于不能是单字节ASCII内码的UnicodeScalar)

let ucScalar: UnicodeScalar = "z"
var bytes: [UTF8.CodeUnit] = []
UTF8.encode(ucScalar, into: { bytes.append($0) })
bytes += [1, 2]
print(bytes) // [122, 1, 2]
// ...
let ucScalar: UnicodeScalar = "u{03A3}" // Σ
var bytes: [UTF8.CodeUnit] = []
UTF8.encode(ucScalar, into: { bytes.append($0) })
bytes += [1, 2]
print(bytes) // [206, 163, 1, 2]

最新更新