2013-06-07 36 views
8

Tôi bắt đầu để tìm mã của tôi rải rác với:So sánh với null trong khách quan c

if([p [email protected]"somekey"] != [NSNull null]) { 

} 

Có ngắn hơn so sánh (nhân vật khôn ngoan) cho NULL?

Bối cảnh: Tôi đang sử dụng thư viện SBJson để phân tích chuỗi JSON và thường có giá trị null (theo thiết kế) cho một số khóa.

+0

Phương pháp objectForKey không trả lại [NSNull null]. Nó trả về nil. – jarmod

+0

Điều này có thể cho bạn một kết quả dương tính giả. Nếu '[p objectForKey: @" someKey "] trả về' nil', kiểm tra của bạn sẽ vượt qua. –

+1

Nó trả về '[NSNull null]' nếu đó là những gì trong từ điển. –

Trả lời

7

Không có gì tích hợp, nhưng sẽ hợp lý và đơn giản để tạo một hàm MYIsNull() sẽ thực hiện so sánh bạn muốn. Chỉ cần suy nghĩ qua những gì bạn muốn trả lại trong trường hợp khóa bị thiếu.

Bạn có thể muốn chuyển sang một cách khác và chuyển đổi -null thành nil. Ví dụ, bạn có thể thêm một loại trên NSDictionary như thế này:

- (id)my_nonNullObjectForKey:(NSString *)key { 
    id value = [self objectForKey:key]; 
    if ([value isEqual:[NSNull null]) { 
    return nil; 
    } 
    return value; 
} 
+0

Tôi thích giải pháp này. Các lập trình viên Objective-C của chúng ta được sử dụng nhiều hơn để xử lý 'nil', và có thể sử dụng các mẫu thông thường của chúng ta như' if (! MyString) ... 'là một điểm cộng lớn. – bdesham

+3

Tiền tố phương pháp đó, xin vui lòng, nếu bạn thêm nó như là một thể loại trên 'NSDictionary'. – bbum

+0

Dangit; giáo viên bắt gặp tôi. Đã sửa. –

-4

Đẹp, chắc chắn bạn chỉ có thể nói

if ([p objectForKey:@"somekey"]) { 

} 

tôi không sử dụng NSNull nhiều đến nỗi tôi không chắc chắn 100% nhưng tôi nghĩ rằng nó kiểm tra là sai và bất kỳ kiểm tra đối tượng khác theo sự thật.

+4

Nếu giá trị của 'someKey' thực tế là 'NSNull', thì thử nghiệm này sẽ vượt qua. Câu lệnh if này là tương đương với 'if ([p objectForKey: @" someKey "] == nil)' –

+1

Tôi đã downvoted bởi vì tôi khá chắc chắn điều này là không chính xác. Bạn có thể kiểm tra nó để chắc chắn không? – bdesham

4

Tôi sẽ sử dụng

if([[p [email protected]"somekey"] isEqual:[NSNull null]] || ![p [email protected]"somekey"]) { 
    // NSNull or nil 
} else { 
    // Stuff exists...Hurray! 
} 

Nó có vẻ làm việc kể từ [NSNull null] thực chất là một "đối tượng". Hy vọng nó giúp!

+2

Trong khi mã hóa tốt hơn, nó hoạt động theo hướng ngược lại của mục tiêu OP (trong đó nó thực sự dài hơn những gì nó thay thế). –

+1

Đây là giải pháp tốt nhất. –

+0

Điều này thực sự không trả lời câu hỏi thực tế? –

2

Không, bạn phải kiểm tra cho NSNull. Tuy nhiên, nếu bạn đang tìm thấy mã của bạn đang được phân tán bởi nó, bạn có thể muốn tạo ra một #define cho nó.

Ghi nhớ rằng nếu cũng p là con số không, hoặc nếu p không có giá trị cho someKey, sau đó [p [email protected]"somekey"] != [NSNull null] đánh giá để YES.

Vì vậy, bạn có thể muốn một cái gì đó như thế này:

#define IsTruthy(X) (X && (X != [NSNull null])) 
1

Có ngắn hơn so sánh (nhân vật khôn ngoan) cho NULL?

[NSNull null] là 13 ký tự. Bạn có thể nói:

NSNull.null // << 11 
(id)kCFNull // << 11 

Hoặc thực hiện một chức năng:

IsNSNull([p [email protected]"somekey"]) // << 10 in this case and requires no ==, != 

Hoặc (cringes) sử dụng một thể loại:

[p [email protected]"somekey"].mon_isNSNull // << 13 in this case, but requires no ==, != 

Chỉ cần cẩn thận cách bạn đặt tên cho loại đó khi giao dịch với nil người nhận.

0

Vì bạn đang sử dụng SBJSON, bạn có thể dễ dàng thay đổi mã của nó - bạn có nguồn.

Tôi đã thực sự sửa đổi SBJSON trình phân tích cú pháp để bỏ qua [NSNull null] giá trị.Chúng không được thêm vào từ điển và khi tôi gọi objectForKey:, tôi không bao giờ nhận được [NSNull null], tôi chỉ nhận được nil. Sau đó, trong hầu hết các trường hợp, tôi thậm chí không phải kiểm tra xem giá trị có phải là nil vì gọi phương thức trên nil thường mang lại kết quả như tôi mong đợi hay không.

0

Nếu bạn chỉ lo lắng về số lượng thời gian chụp của bạn để gõ, hãy xem xét các macro:

#define ISNULL(key) [p objectForKey:key] == [NSNull null] 

sau đó

if (!ISNULL(@"somekey")) ...