Ios Cocoa异步套接字教程代码从Swift 2到Swift 3的转换

Ios Cocoa异步套接字教程代码从Swift 2到Swift 3的转换,ios,swift3,swift2,bonjour,code-conversion,Ios,Swift3,Swift2,Bonjour,Code Conversion,我正在学习Swift 2 Cocoa异步套接字教程,该教程是从Swift 2下载的,是用Swift 2编写的,我正在使用Xcode 8/Swift 3。转换似乎相当好,只有一些更正,除了一个地方,我似乎无法作出必要的更正 原始Swift 2代码: func socket(_ sock: GCDAsyncSocket!, didRead data: Data!, withTag tag: Int) { if tag == 1 { var bodyLength: Int1

我正在学习Swift 2 Cocoa异步套接字教程,该教程是从Swift 2下载的,是用Swift 2编写的,我正在使用Xcode 8/Swift 3。转换似乎相当好,只有一些更正,除了一个地方,我似乎无法作出必要的更正

原始Swift 2代码:

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)
    }
}
结果是“致命错误:在展开可选值时意外发现nil”。我一直在看有关Swift 3中关于获取“sizeof”数据的更改的帖子,不确定对“MemoryLayout”的更改是否正确。此外,我还尝试了以下一些更改,涉及对NSKeyedUnachiver.unarchiveObjectWithData功能的使用进行Swift 3更改,但这些更改也不能提供有效的解决方案

如能提供任何帮助或指明转换解决方案的位置,将不胜感激

print(MemoryLayout<Data>.size == 8)
你确定这就是你所期望的吗?它是数据类型的大小,而不是存储的字节数

数据的大小(例如)

印刷品

true
10
你确定这就是你所期望的吗?它是数据类型的大小,而不是存储的字节数

数据的大小(例如)

印刷品

true
10

请,请,请停止使用
强制展开对象。导致此错误的原因是,您正在强制展开对象,但未正确处理这些对象可能为
nil
。您的对象应该是可选的或非空的。如果继续使用
,您将继续遇到这样的崩溃。这不是安全代码。请,请,请停止使用
强制展开对象。导致此错误的原因是,您正在强制展开对象,但未正确处理这些对象可能为
nil
。您的对象应该是可选的或非空的。如果继续使用
,您将继续遇到这样的崩溃。这是不安全的代码。感谢您的回复-我正在查找套接字数据包第二部分中存储的字节数。然后,必须在tag==2段中“解包”此数据包,在该段中,它使用“NSKeyedUnarchiver.unarchiveObject(with:data)”过程还原原始对象。在Swift 3中处理这一问题的方式似乎发生了重大变化,即使在做了相当多的研究和阅读之后,我也不完全清楚如何让Swift 3正确处理这一问题。提前感谢您的帮助。感谢您的回复-我正在查找套接字数据包第二部分中存储的字节数。然后,必须在tag==2段中“解包”此数据包,在该段中,它使用“NSKeyedUnarchiver.unarchiveObject(with:data)”过程还原原始对象。在Swift 3中处理这一问题的方式似乎发生了重大变化,即使在做了相当多的研究和阅读之后,我也不完全清楚如何让Swift 3正确处理这一问题。提前感谢您的帮助。
10