2016-11-12 14 views
3

Ich schreibe eine Datei auf die Festplatte und bin gerade dabei, meinen Code in Swift 3 zu konvertieren, und blieb auf etwas stecken. Wollte sehen, ob mir jemand in die richtige Richtung gehen könnte.Unsichere Bytes in Swift 3

Mein aktueller Codeblock ist:

open let text: NSString 
data = possibleData ?? Data() 
open let fileURL: URL? 
open let fileEncoding: String.Encoding? 
fileprivate let data: Data! 

text = NSString(bytesNoCopy: UnsafeMutableRawPointer(mutating: data.bytes.bindMemory(to: Void.self, capacity: data.count)), length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! 

Swift sagt, dass data.bytes Aufruf nicht verfügbar ist und ich brauche stattdessen .unsafebytes zu verwenden. Ich begreifen nicht, wie Sie aufrufen unsichere Bytes (es ist nicht so einfach, wie Bytes zu unsicheren Bytes schaltend)

Also habe ich ein wenig Forschung und einige Leute haben gesagt, um einen Verschlussblock wie folgt zu verwenden:

data.withUnsafeMutableBytes {(bytes: UnsafeMutablePointer<UInt8>)->Void in 
      //work with bytes in here 
     } 

Mein Problem ist, was ich in den Schließblock setzen, um meinen obigen Code zu arbeiten? Ich denke, ich vermisse etwas grundsätzlich. Ich kann keine Bytes verwenden, weil es wieder denselben Fehler gibt.

Wer hat irgendwelche Ideen? Vielen Dank!

+0

Mögliche Duplikat [ 'Bytes' ist nicht verfügbar: Verwendung withUnsafeBytes statt] (http://stackoverflow.com/questions/38979575/bytes-is-unavailable-use-withunsafebytes-instead) –

+2

Was sind Sie eigentlich versuchen zu erreichen? Konvertiere eine Zeichenkette in Daten oder umgekehrt? Schreiben Sie eine Zeichenfolge oder Daten in eine Datei? Was ist gegeben und was soll berechnet werden? –

+0

Entschuldigung, es stellte sich heraus, dass dies Teil von "Swiftache" war, einem früheren Entwickler. Ich habe es gerade aktualisiert und mir geht es jetzt gut, danke! – NullHypothesis

Antwort

2

Wenn Sie wirklich dieses Muster verwenden müssen, data Annahme war ein var und kein let, Sie so etwas wie tun könnte:

let text = data.withUnsafeMutableBytes { bytes in 
    return NSString(bytesNoCopy: bytes, length: data.count, encoding: encoding.rawValue, freeWhenDone: false)! 
} 

Oder, ich weiß nicht, warum Sie NSString verwenden würde, so könnten Sie tun:

let text = data.withUnsafeMutableBytes { bytes in 
    return String(bytesNoCopy: bytes, length: data.count, encoding: encoding, freeWhenDone: false)! 
} 

Ehrlich gesagt, das ganze Muster zerbrechlich scheint (warum forcierter Guss warum mit unsicheren Zeiger anstatt verschiedene sichere Muster usw.?). Wenn Sie das in eine Datei schreiben, warum schreiben Sie dann nicht einfach Data?

do { 
    try data.write(to: fileURL) 
} catch { 
    print("Error: \(error.localizedDescription)") 
} 
+0

Danke, stellt sich heraus, dass dieser Code Teil von Swifache (3rd Party Library) war. Ich habe das Neueste heruntergeladen. Ich habe das komplett vermisst, als ich b/c der Art und Weise, wie die Datei ausgebrochen wurde, gepostet habe und auch b/c die vorherigen Entwickler die Kommentare entfernt haben. Vielen Dank, aber Sie haben mir geholfen, das zu verstehen (indem Sie die Form des Codes insgesamt in Frage stellen). – NullHypothesis