2013-06-07 22 views
8

null karşılaştırın?benim kod ile çevrili bulmak başlıyorum nesnel c

Arka plan: Bir JSON dizesini ayrıştırmak için SBJson kitaplığını kullanıyorum ve bazı anahtarlar için genellikle boş değerler (tasarıma göre) vardır.

+0

objectForKey yöntemi [NSNull null] döndürmez. Nil döndürür. – jarmod

+0

Bu size yanlış bir pozitif verebilir. Eğer [p objectForKey: @ "someKey"] 'nil' döndürürse, testiniz geçer. –

+1

Sözlüğün içinde bulunuyorsa, [NSNull null] 'döndürür. –

cevap

7

Hiçbir şey yerleşik değil, ancak istediğiniz karşılaştırmayı yapacak MYIsNull() işlevini oluşturmak makul ve basit olur. Sadece anahtarın eksik olduğu durumda geri dönmek istediğiniz şeyi düşünün.

Diğer yöne gitmek ve -null'u nil'a dönüştürmek isteyebilirsiniz. Örneğin, böyle NSDictionary bir kategori ekleyebilirsiniz:

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

Bu çözümü beğendim. Biz Objective-C programcıları 'nil' ile baş etmede çok daha fazla kullanılırlar ve '' (myString) 'gibi büyük alışkanlıklarımızı kullanırlar. – bdesham

+3

Bu yöntemi önekle, lütfen 'NSDictionary' üzerinde bir kategori olarak eklerseniz. – bbum

+0

Dangit; öğretmen beni yakaladı. Sabit. –

-4

sadece

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

} 

ben çok bu yüzden% 100 emin değilim ama o kadar yanlış ve gerçek olarak başka bir nesnenin testleri testleri düşünüyorum NSNull kullanmayın söyleyebiliriz eminim.

+4

Eğer 'someKey' değeri aslında 'NSNull' ise, bu test geçecektir. Bu if ifadesi, 'if ([p objectForKey: @" someKey "] == nil)' –

+1

'a eşittir çünkü bu yanlış olduğundan eminim. Emin olmak için lütfen test edebilir misiniz? – bdesham

4

Ben O [NSNull null] bir "nesne" aslında olduğundan çalışmıyor gibi görünüyor

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

kullanmak. Umarım yardımcı olur!

+2

Daha iyi kodlama yapmakla birlikte, OP'nin hedefinin ters yönünde çalışır (aslında değiştirdiğinden daha uzun). –

+1

Bu en iyi çözümdür. –

+0

Bu gerçekten asıl soruya cevap vermiyor mu? –

2

Hayır, NSNull test etmek gerekir. Bununla birlikte, eğer kodunuzu bulup buluyorsanız, bunun için bir #define oluşturmak isteyebilirsiniz.

Ayı da p nil ise veya psomeKey için bir değer yoksa, o zaman [p [email protected]"somekey"] != [NSNull null]YES olarak değerlendirilirse akılda.

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

NULL kısa (karakter-bilge) karşılaştırma var mı:

Yani muhtemelen böyle bir şey istiyor?

13 chars.

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

Veya bir işlev yapmak: Sen söyleyebiliriz

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

Ya (cringes) Bir kategori kullanın:

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

Sadece nil ile uğraşırken o kategoriyi isim nasıl dikkatli olun alıcılar.

0

SBJSON'u kullandığınızdan, kodunu kolayca değiştirebilirsiniz - kaynağınız var.

[NSNull null] değerlerini atlamak için SBJSON ayrıştırıcısını değiştirdim.Onlar sözlüklere eklenmez ve ben objectForKey: aradığımda, [NSNull null] almak, sadece nil olsun. Daha sonra, çoğu durumda, nil numaralı bir yöntemin çağrılması genellikle beklediğim sonucu verdiğinden, değerin nil olup olmadığını kontrol etmek zorunda bile değilim. Eğer sizin yazmanız alarak süreyi hakkında sadece endişeliysen

0

, makro düşünün:

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

sonra

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