2017-02-07 2 views
0

Ich versuche, diesen Code aus dem Bereich Dokumentation zu verwenden:Wie verwenden Sie Data.withUnsafeMutbleBytes in Swift 3?

var key = Data(count: 64) 
_ = key.withUnsafeMutableBytes { bytes in 
    SecRandomCopyBytes(kSecRandomDefault, 64, bytes) 
} 

Auf seinem eigenen, wird dies kompilieren. Doch als withUnsafeMutableBytes vervollständigt mit einem Verschluss, statt diese Art von Code Fluss:

var key = Data(count: 64) 
_ = key.withUnsafeMutableBytes { bytes in 
    SecRandomCopyBytes(kSecRandomDefault, 64, bytes) 
} 
// do something using the encryption key 

Ich will es, dies zu ändern:

var key = Data(count: 64) 
_ = key.withUnsafeMutableBytes { bytes in 
    SecRandomCopyBytes(kSecRandomDefault, 64, bytes) 
    // do something using the encryption key 
} 

Aber ich kann einfach nichts anderes zur Schließung hinzuzufügen, ohne Start zu erhalten Fehler, zum Beispiel ist es nicht möglich, einfach fügen Sie einfach eine print-Anweisung:

var key = Data(count: 64) 
    _ = key.withUnsafeMutableBytes { bytes in 
     SecRandomCopyBytes(kSecRandomDefault, 64, bytes) 
     print("WTF!") 
    } 

diesen Fehler geben:

enter image description here

Wenn ich versuche, den von _, dann wird sie diesen Fehler loszuwerden:

enter image description here

ich diesen Thread https://forums.developer.apple.com/thread/51439

Aber nach dem Versuch gefunden, was in diesem Thread ist, die doesn 't Kompilieren tatsächlich kompilieren, und so nach dem Anwenden von XCode Autokorrekturen, habe ich nur mit einem Fehler nach dem anderen nach dem anderen nach dem anderen und es macht mich verrückt.

+0

Es gibt ein Problem, dass 'SecRandomCopyBytes' fehlschlagen kann, für die überprüft werden muss. – zaph

+0

Hinweis: Die Frage hier scheint zu sein, wie Anweisungen innerhalb der Schließung hinzugefügt werden. – zaph

+0

@zaph Und das Duplikat, auf das ich zeigte, zeigte wie. Jetzt muss ich wiederholen, was das Duplikat schon sagt, was den ganzen Punkt vermeidet, als Duplikat markieren zu können. – matt

Antwort

1

Ignorieren der SecRandomCopyBytes Teil der Gesamt vollständige Syntax lautet:

var key = Data(count: 64) 
key.withUnsafeMutableBytes { (ptr:UnsafeMutablePointer<UInt8>) -> Void in 
    print("here") 
} 

SecRandomCopyBytes Putting scheint keinen gravierenden Unterschied zu machen:

var key = Data(count: 64) 
key.withUnsafeMutableBytes { (ptr:UnsafeMutablePointer<UInt8>) -> Void in 
    SecRandomCopyBytes(kSecRandomDefault, 64, ptr) 
    print("here") 
} 

, die nicht Ihre endgültige Code sein könnte, der natürlich, aber der Punkt ist, dass es kompiliert und erlaubt Ihnen weiter zu entwickeln, den Code weiter. - Eigentlich nur für lacht, habe ich versucht, die folgenden, um zu sehen, ob wir wirklich die Daten mit zufälligen Bytes wurden bevölkern, und es scheint gut zu funktionieren:

var key = Data(count: 64) 
    key.withUnsafeMutableBytes { (ptr:UnsafeMutablePointer<UInt8>) -> Void in 
     _ = SecRandomCopyBytes(kSecRandomDefault, 64, ptr) 
    } 
    for b in key {print(b)} 

Beachten Sie die Verwendung von _ = die Warnung über zu unterdrücken das ungenutzte Ergebnis

+0

Ein Punkt: Das Hinzufügen der Anweisung 'print' erfordert das Ändern von' ptr in' nach '(ptr: UnsafeMutablePointer ) -> Void in', was eine unglückliche, überraschende, aber verständliche Verschlusssyntax ist. – zaph

+0

@zaph Ich muss mich fragen, ob das OP einen Fehler im Swift-Compiler gefunden hat. Warum sollten Sie beim Hinzufügen einer zweiten Zeile explizit angeben, was offensichtlich der Fall ist, dass die Bytes einer Daten UInt8 sind? – matt

Verwandte Themen