Редактировать, обновить мой ответ для двух вещей:
- Не возвращает указатель с withUnsafeBytes
- Учет Swift 5 ', предупреждение об устаревании: ' withUnsafeBytes 'устарело: используйте
withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R
вместо
// buffer pointer captured is converted to byte pointer which is used in the block to decode the base64 encoded Data
encodedStringData.withUnsafeMutableBytes { (rawBufferPtr: UnsafeMutableRawBufferPointer) in
if let rawPtr = rawBufferPtr.baseAddress {
let decodedString = String(bytesNoCopy: rawPtr, length: rawBufferPtr.count, encoding: .utf8, freeWhenDone: false)
print(decodedString!)
}
}
Примечание. Swift 5 не позволяет получить доступ к encodedStringData
из блока withUnsafeMutableBytes
! Прочитайте Swift 5 Эксклюзивное правоприменение для why
.
Захват указателя за пределами блока, видимо, не рекомендуется, он работает, но поведение может стать неопределенным в будущем
Старый ответ:
Это поможет кому-то искать дальнейшие необработанные байты (в представлении UnsafeMutablePointer<UInt8>
) объекта Data
как переменную для дальнейшего использования (вместо того, чтобы писать все логика в блоке withUnsafeMutableBytes
).
var encodedStringData = Data(base64Encoded: "Vmlub2QgaXMgZ3JlYXQh")!
// byte pointer variable used later to decode the base64 encoded Data
let rawPtr: UnsafeMutablePointer<UInt8> = encodedStringData.withUnsafeMutableBytes { (bytePtr: UnsafeMutablePointer<UInt8>) in bytePtr }
let decodedString = String(bytesNoCopy: rawPtr, length: encodedStringData.count, encoding: .utf8, freeWhenDone: false)
print(decodedString, encodedStringData)