Швидкий 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:)