Swift 2.0
Wygląda na to, że Swift 2.0 faktycznie wprowadził String(data:encoding:)
rozszerzenie String podczas importu Foundation
. Nie znalazłem żadnego miejsca, w którym jest to udokumentowane, co jest dość dziwne.
(przed Swift 2.0) Lekkie rozszerzenie
Oto małe rozszerzenie do skopiowania bez użycia NSString
, wytnijmy pośrednika.
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)
}
Daje to również dostęp do tego, data.byteBuffer
który jest typem sekwencji, więc wszystkie te fajne operacje, które możesz wykonać z sekwencjami, również działają, na przykład wykonywanie reduce { $0 &+ $1 }
sumy kontrolnej.
Uwagi
W mojej poprzedniej edycji użyłem tej metody:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Problem z takim podejściem jest to, że tworzę kopię informacji do nowej tablicy, w ten sposób, ja powielenie ilości bajtów (w szczególności: encoding size * data.length
)