【发布时间】:2017-11-27 13:29:06
【问题描述】:
我正在学习从 https://github.com/nickyhuyskens/SwiftCocoaAsyncSocketTutorial 下载的 Swift 2 Cocoa Async Socket 教程,它是用 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)
}
}
我的 Swift 3 变化:
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)
}
}
当它到达线路时
let packet = NSKeyedUnarchiver.unarchiveObject(with: data) as! Packet
结果是“致命错误:在展开可选值时意外发现 nil”。我一直在查看涉及 Swift 3 中关于获取“sizeof”数据的更改的帖子,并且不确定对“MemoryLayout”的更改是否正确。此外,在涉及 Swift 3 更改使用 NSKeyedUnarchiver.unarchiveObjectWithData 功能的帖子之后,我尝试了一些更改,但这些也没有提供有效的解决方案。
任何帮助或指出可以找到转换解决方案的地方将不胜感激。
【问题讨论】:
-
请,请,请停止使用
!强制解包对象。导致此错误的原因是您强制展开对象并且没有正确处理这些对象可能是nil的事实。您的对象应该是可选的或非空的。如果您继续使用!,您将继续遇到这样的崩溃。这不是安全代码。
标签: ios swift3 swift2 bonjour code-conversion