Swift 2.0
Görünüşe göre Swift 2.0, String(data:encoding:)içe aktarırken aslında bir String uzantısı olarak tanıttı Foundation. Bunun belgelendiği bir yer bulamadım, garip bir şekilde.
(Swift 2.0 öncesi) Hafif uzantı
İşte kullanmadan kopyalanabilir küçük bir uzantı NSString, orta adamı keselim.
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)
}
Bu aynı zamanda data.byteBufferbir dizi türü olan erişim sağlar , bu nedenle dizilerle yapabileceğiniz tüm bu harika işlemler de reduce { $0 &+ $1 }bir sağlama toplamı için a yapmak gibi çalışır .
notlar
Önceki düzenlememde bu yöntemi kullandım:
var buffer = Array<UInt8>(count: data.length, repeatedValue: 0x00)
data.getBytes(&buffer, length: data.length)
self.init(bytes: buffer, encoding: encoding)
Bu yaklaşımdaki sorun, ben böylece, bayt miktarını çoğaltarak ediyorum, yeni bir diziye bilgilerin bir kopyasını oluşturarak olmam (özellikle: encoding size * data.length)