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.
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