Швидкий 2.0
Здається, що Swift 2.0 фактично представив String(data:encoding:)
розширення String під час імпорту Foundation
. Я не знайшов жодного місця, де це документально зафіксовано, досить дивно.
(до Swift 2.0) Легке розширення
Ось невелике розширення, яке можна скопіювати без використання NSString
, давайте виріжемо середню людину.
import Foundation
extension NSData
{
var byteBuffer : UnsafeBufferPointer<UInt8> { get { return UnsafeBufferPointer<UInt8>(start: UnsafeMutablePointer<UInt8>(self.bytes), count: self.length) }}
}
extension String
{
init?(data : NSData, encoding : NSStringEncoding)
{
self.init(bytes: data.byteBuffer, encoding: encoding)
}
}
// Playground test
let original = "Nymphs blitz quick vex dwarf jog"
let encoding = NSASCIIStringEncoding
if let data = original.dataUsingEncoding(encoding)
{
String(data: data, encoding: encoding)
}
Це також надає вам доступ до data.byteBuffer
типу послідовності, тому всі ті класні операції, які ви можете робити з послідовностями, також працюють, як, наприклад, reduce { $0 &+ $1 }
для контрольної суми.
Примітки
У попередньому редагуванні я використовував цей метод:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Проблема такого підходу полягає в тому, що я створюю копію інформації в новий масив, таким чином, я дублюю кількість байтів (конкретно encoding size * data.length
:)