2012-05-16 36 views
5

Tôi đang cố gán một biến có loại 'long long' thành kiểu NSUInteger, cách chính xác để làm điều đó là gì?Chuyển đổi ngầm định mất độ chính xác nguyên: 'long long' thành 'NSInteger' (aka 'int')

dòng mã của tôi:

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

nơi expectedSize là loại NSUInteger và kiểu trả về của response.expectedContentLength là loại 'long long'. Biến số response thuộc loại NSURLResponse.

Các lỗi biên dịch được hiển thị là:

Issue Semantic: chuyển đổi ngầm mất nguyên chính xác: 'dài dài' thành 'NSUInteger' (aka 'unsigned int')

+1

Bạn có thể làm một diễn viên rõ ràng hoặc bạn có biết điều này và câu hỏi của bạn về nhiều hơn "cách"? Đây là dòng có dàn diễn viên rõ ràng: 'expectedSize = response.expectedContentLength> 0? (NSUInteger) response.expectedContentLength: 0; ' – Clafou

Trả lời

5

Nó thực sự chỉ là một diễn viên, với một số kiểm tra phạm vi:

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' kiểm tra là không chính xác. Giá trị -1 có nghĩa là "không có kỳ vọng nào có thể đạt được về độ dài nội dung dự kiến" (xem NSURLResponse.h) –

+0

@Dmitry được thêm vào ví dụ. nó là một chi tiết thực hiện rất cụ thể, mà có thể đã bị bắt. nó có nghĩa là để chứng minh quá trình, chứ không phải là một thực hiện hoàn hảo và hoàn chỉnh (nó vẫn không phải là). – justin

11

bạn có thể thử chuyển đổi với NSNumber:

NSUInteger expectedSize = 0; 
    if (response.expectedContentLength) { 
    expectedSize = [NSNumber numberWithLongLong: response.expectedContentLength].unsignedIntValue; 
    } 
Các vấn đề liên quan