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.
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.
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;
}
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
Bu yöntemi önekle, lütfen 'NSDictionary' üzerinde bir kategori olarak eklerseniz. – bbum
Dangit; öğretmen beni yakaladı. Sabit. –
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.
Eğer 'someKey' değeri aslında 'NSNull' ise, bu test geçecektir. Bu if ifadesi, 'if ([p objectForKey: @" someKey "] == nil)' –
'a eşittir çünkü bu yanlış olduğundan eminim. Emin olmak için lütfen test edebilir misiniz? – bdesham
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!
Daha iyi kodlama yapmakla birlikte, OP'nin hedefinin ters yönünde çalışır (aslında değiştirdiğinden daha uzun). –
Bu en iyi çözümdür. –
Bu gerçekten asıl soruya cevap vermiyor mu? –
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 p
someKey
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]))
13 chars.NULL kısa (karakter-bilge) karşılaştırma var mı:
Yani muhtemelen böyle bir şey istiyor?
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.
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
, makro düşünün:
#define ISNULL(key) [p objectForKey:key] == [NSNull null]
sonra
if (!ISNULL(@"somekey")) ...
objectForKey yöntemi [NSNull null] döndürmez. Nil döndürür. – jarmod
Bu size yanlış bir pozitif verebilir. Eğer [p objectForKey: @ "someKey"] 'nil' döndürürse, testiniz geçer. –
Sözlüğün içinde bulunuyorsa, [NSNull null] 'döndürür. –