Swift 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
)