2017-06-23 5 views
0

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.

+0

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

Répondre

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

impressions

true 

êtes-vous sûr que ce soit ce que vous attendez-vous? C'est la taille du type de données, pas le nombre d'octets stockés.

la taille des données (par exemple)

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

impressions

10 
+0

Merci pour la réponse - Je suis certainement à la recherche du nombre d'octets stockés dans la deuxième partie du paquet de données de socket. Ce paquet de données doit ensuite être "décompressé" dans le segment tag == 2 où il utilise le processus "NSKeyedUnarchiver.unarchiveObject (with: data)" pour restaurer l'objet d'origine. Il semble y avoir eu un changement significatif dans la façon dont cela est géré dans Swift 3 et même après avoir fait pas mal de recherches et de lecture, je ne suis pas tout à fait clair sur la façon de faire en sorte que Swift 3 gère correctement cela. Merci d'avance pour votre aide. – FlapJack