2012-05-16 15 views
5

NSUInteger türüne 'long long' türünde bir değişken atamaya çalışıyorum, Bunu yapmanın doğru yolu nedir?Implicit conversion tamsayı hassasiyeti kaybeder: 'long long' - 'NSInteger' (aka 'int')

kodum hattı: expectedSize tipi NSUInteger ait olup response.expectedContentLength döndürme türü

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

'long long' tiptedir. response değişkeni NSURLResponse tipindedir.

gösterilen derleme hatadır:

Semantik Sayı: 'Uzun uzun' 'NSUInteger' için (aka 'imzasız int')

+1

Açık bir yayın yapabilir veya bunu biliyor muydunuz ve "nasıl" dan daha fazlası hakkında sorunuz var mı? İşte açık döküm ile satır: 'beklenenSize = response.expectedContentLength> 0? (NSUInteger) response.expectedContentLength: 0; ' – Clafou

cevap

5

gerçekten sadece bir döküm bazı aralık denetimi ile, var:

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

' <0' doğru değil. -1 değeri, "beklenen içerik uzunluğuyla ilgili gelebilecek bir beklenti yok" (bkz. NSURLResponse.h) –

+0

@Dmitry örneğini örnek olarak gösterir. Yakalanan çok özel bir uygulama detayı. Mükemmel ve eksiksiz bir uygulama olmaktan ziyade süreci göstermek anlamına gelmekteydi (hala değil). – justin

11

deneyebilirsin: Örtülü dönüşüm tamsayı hassasiyet kaybeder NSNumber ile dönüşüm:

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