2009-05-21 44 views
11

tôi đang làm một kiểm tra trong một ứng dụng iPhone - "so sánh giữa con trỏ và số nguyên"Làm thế nào để kiểm tra nếu một nguyên thủy trong Mục tiêu-C là nil?

int var; 
if (var != nil) 

Nó hoạt động, nhưng trong X-Bộ luật này là tạo ra một cảnh báo Làm thế nào để tôi sửa chữa nó?

Tôi đến từ thế giới Java, nơi tôi khá chắc chắn tuyên bố ở trên sẽ thất bại trong việc tuân thủ.

Trả lời

33

Primitives không thể nil. nil được dành riêng cho con trỏ đến đối tượng Objective-C. nil về mặt kỹ thuật là kiểu con trỏ, và các con trỏ trộn và số nguyên sẽ không có một diễn viên sẽ hầu như luôn dẫn đến cảnh báo trình biên dịch, với một ngoại lệ: hoàn toàn ổn định để chuyển đổi hoàn toàn số nguyên 0 sang con trỏ không có dàn diễn viên.

Nếu bạn muốn phân biệt giữa 0 và "không có giá trị", sử dụng lớp NSNumber:

NSNumber *num = [NSNumber numberWithInt:0]; 
if(num == nil) // compare against nil 
    ; // do one thing 
else if([num intValue] == 0) // compare against 0 
    ; // do another thing 
10
if (var) { 
    ... 
} 

Chào mừng bạn đến với thế giới tuyệt vời của C. Bất kỳ giá trị nào không bằng số nguyên 0 hoặc con trỏ null đều đúng.

Nhưng bạn có lỗi: int không được rỗng. Chúng là kiểu giá trị giống như trong Java.

Nếu bạn muốn "hộp" số nguyên, sau đó bạn cần phải hỏi nó cho địa chỉ của nó:

int can_never_be_null = 42; // int in Java 
int *can_be_null = &can_never_be_null; // Integer in Java 
*can_be_null = 0; // Integer.set or whatever 
can_be_null = 0; // This is setting "the box" to null, 
        // NOT setting the integer value 
+0

tất cả mọi thứ dường như để làm việc mặc dù, nơi là một trường hợp này sẽ cho tôi vấn đề? chỉ dành cho một số nền - "var" là thuộc tính trong đối tượng miền. Trong một trong ViewControllers của tôi, tôi có một UISegmentedViewController được sử dụng để thiết lập giá trị của "var". Vì vậy, trước khi người dùng chọn bất cứ điều gì, var chưa được thiết lập. – bpapa

+0

var == 0 nếu chưa được đặt –

+0

Chắc chắn nó đã được đặt - nó được đặt thành giá trị không xác định. ints có thể * chỉ * nhận các giá trị tích phân. Bạn nên so sánh với 0 hoặc bạn nên sử dụng một cờ BOOL riêng để xác định/chỉ định liệu 'var' có hợp lệ không. –

Các vấn đề liên quan