我想要类似的东西:
let a = ["v".utf8[0], 1, 2]
我最接近的是:
let a = [0x76, 1, 2]
和
"v".data(using: String.Encoding.utf8)! + [1, 2]
注意:[UInt8]
或Data
是可接受的类型。
答案 0 :(得分:3)
有一个特定的UInt8
初始值设定项(在Swift 2.2 +中引入):
let a = [UInt8(ascii:"v"), 1 ,2]
答案 1 :(得分:3)
String
的{{1}}未被UTF8View
编入索引,而是自己的Int
类型,因此为了包含UTF-8序列的第一个字节对于数组文字中的给定字符串,您可以使用其String.UTF8View.Index
属性:
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
答案 2 :(得分:3)
(已发布的答案的一些附录;特别是关于UnicodeScalar
在您的问题中,您已使用文字"v"
作为要转换为UInt8
的基本实例;我们真的不知道这是String
还是例如在您的实际使用案例中UnicodeScalar
。接受的答案显示了一些巧妙的方法,以防您使用String
实例。
如果您恰好使用UnicodeScalar
实例(而不是String
),则一个答案已经提到了init(ascii:)
UInt8
初始值设定项。但是,您应该注意,以验证此初始化程序中使用的UnicodeScalar
实例确实是符合ASCII字符编码的实例;大多数UnicodeScalar
值都不会(这将导致此初始化程序的运行时异常)。您可以使用例如UnicodeScalar
的{{3}}属性,用于在使用初始化程序之前验证此事实。
let ucScalar: UnicodeScalar = "z"
var a = [UInt8]()
if ucScalar.isASCII {
a = [UInt8(ascii: ucScalar), 1, 2]
}
else {
// ... unexpected but not a runtime error
}
另一种方法,如果您要将完整的UnicodeScalar
编码为UInt8
格式(即使UnicodeScalar
不能是单字节ASCII格式endoded)正在使用isASCII
的encode(_:into:)
方法:
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]