2017-06-23 3 views
0

Ich arbeite durch eine Swift 2 Cocoa Async Sockel-Tutorial, die von https://github.com/nickyhuyskens/SwiftCocoaAsyncSocketTutorial heruntergeladen wurde Es wurde in Swift 2 geschrieben und ich arbeite mit Xcode 8/Swift 3. Die Konvertierung scheinen ziemlich gut zu sein mit nur ein paar Korrekturen, außer an einem Ort, an dem ich nicht die nötige Korrektur machen kann.Cocoa Async Socket Tutorial Code-Konvertierung von Swift 2 nach Swift 3

Original-Swift-2-Code:

func socket(_ sock: GCDAsyncSocket!, didRead data: Data!, withTag tag: Int) 
{ 
    if tag == 1 { 
     var bodyLength: Int16 = 0 
     data.getBytes(&bodyLength, length: sizeof(Int16)) 
     print("Header received with bodylength: \(bodyLength)") 
     socket.readDataToLength(UInt(bodyLength), withTimeout: -1, tag: 2) 
    } else if tag == 2 {    
     let packet = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! Packet 
     PacketHandler.HandlePacket(packet) 
     socket.readDataToLength(UInt(sizeof(Int16)), withTimeout: -1, tag: 1) 
     socket.readData(toLength: UInt(MemoryLayout<Int16>.size), withTimeout: -1, tag: 1) 
    } 
} 

Meine Swift 3 Änderungen:

func socket(_ sock: GCDAsyncSocket!, didRead data: Data!, withTag tag: Int) { 
    if tag == 1 { 
        var bodyLength: UInt16 = 0 
     bodyLength = (UInt16(MemoryLayout<Data>.size)) 
     print("Header received with bodylength: \(bodyLength)") 
     socket.readData(toLength: UInt(bodyLength), withTimeout: -1, tag: 2) 
    } else if tag == 2 { 
     let packet = NSKeyedUnarchiver.unarchiveObject(with: data) as! Packet 
     PacketHandler.HandlePacket(packet) 
     socket.readData(toLength: UInt(MemoryLayout<Int16>.size), withTimeout: -1, tag: 1) 
    } 
} 

Wenn es wird auf die Linie

let packet = NSKeyedUnarchiver.unarchiveObject(with: data) as! Packet 

das Ergebnis ist ein „fataler Fehler: unerwartet nil beim Entpacken eines optionalen Wertes gefunden ". Ich habe Posts mit den Änderungen in Swift 3 angeschaut, um Änderungen an den "sizeof" -Daten vorzunehmen, und bin mir nicht sicher, ob der Wechsel zu "MemoryLayout" korrekt war. Auch habe ich eine Reihe von Änderungen nach Posts mit Swift 3 Änderungen an der Verwendung der NSKeyedUnarchiver.unarchiveObjectWithData Funktionalität versucht, aber diese bieten auch keine funktionierende Lösung.

Jede Hilfe oder Hinweis, wo die Konversionslösung gefunden werden kann, würde sehr geschätzt werden.

+0

Bitte, bitte, bitte aufhören mit '!' Unwrap Objekte zu erzwingen. Dieser Fehler wird verursacht, weil Sie Objekte zwangsweise auspacken und die Tatsache, dass diese Objekte "nil" sein könnten, nicht richtig behandeln. Ihre Objekte sollten entweder optional oder nicht null sein. Wenn Sie weiterhin '!' Verwenden, werden Sie weiterhin Abstürze wie diese bekommen. Es ist kein sicherer Code. – AdamPro13

Antwort

0
print(MemoryLayout<Data>.size == 8) 

druckt

true 

Sind Sie sicher, dass das ist, was erwarten Sie? Es ist die Größe des Datentyps, nicht die Anzahl der gespeicherten Bytes.

die Größe der Daten (zum Beispiel)

let data = Data(bytes: [1,2,3,4,5,6,7,8,9,0]) 
print(data.count) 

druckt

10 
+0

Danke für die Antwort - Ich suche definitiv nach der Anzahl der gespeicherten Bytes im zweiten Teil des Socket-Datenpakets. Dieses Datenpaket muss dann im Tag == 2-Segment "entpackt" werden, wo es den Prozess "NSKeyedUnarchiver.unarchiveObject (with: data)" verwendet, um das ursprüngliche Objekt wiederherzustellen. Es scheint eine signifikante Veränderung in der Art und Weise gegeben zu haben, wie dies in Swift 3 gehandhabt wird, und selbst nachdem ich ein wenig nachforschen und lesen konnte, bin ich mir nicht ganz im Klaren darüber, wie Swift 3 das richtig handhaben kann. Vielen Dank im Voraus für die Hilfe. – FlapJack