Je travaille sur un tutoriel Swift 2 Cocoa Async Socket qui a été téléchargé de https://github.com/nickyhuyskens/SwiftCocoaAsyncSocketTutorial Il a été écrit en Swift 2 et je travaille avec Xcode 8/Swift 3. La conversion semble assez bon avec seulement quelques corrections, sauf pour un endroit où je ne peux pas sembler faire la correction nécessaire.Tutoriel Cocoa Async Socket Conversion de Swift 2 en Swift 3
originale Code 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)
}
}
Mes Swift 3 changements:
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)
}
}
Quand il arrive à la ligne
let packet = NSKeyedUnarchiver.unarchiveObject(with: data) as! Packet
le résultat est une « erreur fatale: de façon inattendue trouvé nul lors du déballage d'une valeur optionnelle ". J'ai regardé les messages impliquant les changements dans Swift 3 autour de la modification pour obtenir les données "sizeof" et je ne suis pas sûr si le changement de "MemoryLayout" était correct. J'ai également essayé un certain nombre de changements après des messages impliquant des changements de Swift 3 à l'utilisation de la fonctionnalité NSKeyedUnarchiver.unarchiveObjectWithData mais ceux-ci ne fournissent pas non plus une solution de travail.
Toute assistance ou pointant vers où la solution de conversion peut être trouvée serait grandement appréciée.
S'il vous plaît, s'il vous plaît, s'il vous plaît cesser d'utiliser '!' Pour forcer les objets Déballer. Cette erreur est due au fait que vous forcez le déballage des objets et que vous ne gérez pas correctement le fait que ces objets pourraient être "nuls". Vos objets doivent être facultatifs ou non. Vous continuerez à rencontrer des plantages comme celui-ci si vous continuez à utiliser '!'. Ce n'est pas un code sûr. – AdamPro13