La conversione implicita perde intero precisione: ‘lungo’ e ‘NSInteger’ (aka ‘int’)

Sto cercando di assegnare a una variabile di tipo ‘lungo’ per un tipo di NSUInteger, Qual è il modo corretto per farlo?

la mia linea di codice:

expectedSize = response.expectedContentLength > 0 ? response.expectedContentLength : 0;

dove expectedSize è di tipo NSUInteger e tipo di ritorno di response.expectedContentLength è di tipo ‘long long‘. La variabile response è di tipo NSURLResponse.

L’errore di compilazione è:

Problema semantico: la conversione Implicita perde intero precisione: ‘lungo
lungo’ e ‘NSUInteger’ (aka ‘unsigned int’)

Si può fare un cast esplicito, o sapevate che questo è la tua domanda più che il “come”? Ecco la linea con il cast esplicito: expectedSize = response.expectedContentLength > 0 ? (NSUInteger)response.expectedContentLength : 0;

InformationsquelleAutor Firdous | 2012-05-16

2 risposte

  1. 5

    È in realtà solo il cast, con un certo intervallo di controllo:

    const long long expectedContentLength = response.expectedContentLength;
    NSUInteger expectedSize = 0;
    
    if (NSURLResponseUnknownLength == expectedContentLength) {
        assert(0 && "length not known - do something");
        return errval;
    }
    else if (expectedContentLength < 0) {
        assert(0 && "too little");
        return errval;
    }
    else if (expectedContentLength > NSUIntegerMax) {
        assert(0 && "too much");
        return errval;
    }
    
    //expectedContentLength can be represented as NSUInteger, so cast it:
    expectedSize = (NSUInteger)expectedContentLength;
    < 0 di controllo non è corretto. Il valore -1 indica “nessuna aspettativa che può essere arrivato al riguardo previsto lunghezza del contenuto” (vedi NSURLResponse.h)
    aggiunto il caso per esempio. si tratta di un molto specifico dettaglio di implementazione, che sarebbe stato catturato. e ‘ stato pensato per mostrare il processo, piuttosto che essere una perfetta e completa attuazione (ancora non).

    InformationsquelleAutor justin

  2. 11

    si potrebbe provare la conversione con NSNumber:

      NSUInteger expectedSize = 0;
      if (response.expectedContentLength) {
        expectedSize = [NSNumber numberWithLongLong: response.expectedContentLength].unsignedIntValue;
      }

    InformationsquelleAutor CarlJ

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *