Search code examples
swiftswift3nsrange

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<Index>' (aka 'Range<Int>')

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
    }
}

Solution

  • 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)))