我想要类似的东西:
let a = ["v".utf8[0], 1, 2]
我发现的最接近的是:
let a = [0x76, 1, 2]
和
"v".data(using: String.Encoding.utf8)! + [1, 2]
注意:[UInt8]
或Data
都是可接受的类型。
String
的UTF8View
不是由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
),一个答案已经提到了UInt8
的init(ascii:)
初始值设定项。但是,您应该注意验证此初始化器中使用的UnicodeScalar
实例是否确实适合ASCII字符编码;大多数CCD_ 23值将不会(这将导致该初始化器的运行时执行)。在使用初始值设定项之前,您可以使用例如UnicodeScalar
的isASCII
属性来验证这一事实。
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]