i6x86 i6x86 - 5 months ago 99
Swift Question

Cannot convert value of type 'NSRange' (aka 'NSRange') to expected argument type 'Range<Index>' (aka 'Range<Int>')

i'm trying to implement Easy Game Center link but i get this error:


Cannot convert value of type 'NSRange' (aka 'NSRange') to expected
argument type 'Range' (aka 'Range')


here is the code:

static func unarchive(_ data: Data!) -> Packet {
var archivedPacket = ArchivedPacket(index: 0, numberOfPackets: 0, nameLength: 0) //, dataLength: 0
let archivedStructLength = sizeof(ArchivedPacket)

let archivedData = data.subdata(in: NSMakeRange(0, archivedStructLength))
(archivedData as NSData).getBytes(&archivedPacket)

let nameRange = NSMakeRange(archivedStructLength, Int(archivedPacket.nameLength))
let nameData = data.subdata(in: nameRange)
let name = NSString(data: nameData, encoding: String.Encoding.utf8) as! String
let packet = Packet(name: name, index: archivedPacket.index, numberOfPackets: archivedPacket.numberOfPackets)

return packet
}


edit: here is the entire code of the struct:

import Foundation
/**
* Packet
*/
struct Packet {
var name: String
var index: Int64
var numberOfPackets: Int64

/**
* Struc
*/
struct ArchivedPacket {
var index : Int64
var numberOfPackets : Int64
var nameLength : Int64
}
/**
Archive Packet

- returns: NSData
*/
func archive() -> Data {

var archivedPacket = ArchivedPacket(index: Int64(self.index), numberOfPackets: Int64(self.numberOfPackets), nameLength: Int64(self.name.lengthOfBytes(using: String.Encoding.utf8)))

let metadata = Data(
bytes: UnsafePointer<UInt8>(&archivedPacket),
count: sizeof(ArchivedPacket)
)

let archivedData = Data(data: metadata) as Data
archivedData.append(name.data(using: String.Encoding.utf8, allowLossyConversion: false)!)

return archivedData
}
/**
Unarchive Packet

- parameter data: NSData

- returns: Packet
*/
static func unarchive(_ data: Data!) -> Packet {
var archivedPacket = ArchivedPacket(index: 0, numberOfPackets: 0, nameLength: 0) //, dataLength: 0
let archivedStructLength = sizeof(ArchivedPacket)

let archivedData = data.subdata(in: NSMakeRange(0, archivedStructLength))
(archivedData as NSData).getBytes(&archivedPacket)

let nameRange = NSMakeRange(archivedStructLength, Int(archivedPacket.nameLength))
let nameData = data.subdata(in: nameRange)
let name = NSString(data: nameData, encoding: String.Encoding.utf8) as! String
let packet = Packet(name: name, index: archivedPacket.index, numberOfPackets: archivedPacket.numberOfPackets)

return packet
}
}

Answer

You are overcomplicating it by converting to NSRange. This works:

let archivedData = data.subdata(in: 0..<archivedStructLength)
let nameData = data.subdata(in: archiveStructLength..<(archiveStructLength + Int(archivedPacket.nameLength)))