簡體   English   中英

如何在NSNumber中檢查空值

[英]How to check for null value in NSNumber

首先,我承認自己的無知,在我參與項目的幾個月里,我已經學會了所有關於Objective-C的知識。 我還發現Objective-C似乎使我用過的任何其他語言中的簡單問題變得復雜,這讓我感到非常沮喪。 這個問題就是一個例子......

在第一次運行中,我的應用程序下載了一堆JSON,用於填充CoreData存儲。 我使用Obj-C / JSON庫(CJSONDeserializer)將JSON轉換為NSArrays。 在一個CoreData實體的JSON下載中,有一個字段包含一個數字( "show_id":2 ),如果有另一個實體,則標識相關字段,否則為null( "show_id":null )。 在處理該字段時,我使用...將其分配給NSNumber

NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"];

然后我嘗試在嘗試獲取和鏈接相關記錄之前檢查我是否有有效號碼,以便在沒有相關記錄的情況下不進行浪費處理。

用...詢問shoIndex

NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]);

給...

shoIndex: 19590600, <null>, <null>

其中JSON值為null &...

shoIndex: 228300880, 51, 51

除此以外。

到目前為止,我所做的唯一成功檢查是......

if (![[shoIndex description] isEqualToString:@"<null>"]) {

有誰能建議更好的方法?

更新中...

另一種方式是將shoIndex指定為NSNumber ,有時包含NSString@"<null>" Obj-C有類似isa運算符的東西,我可以用它來檢查shoIndex的內容類型嗎?

TIA,Pedro。

使用[shoObject class]獲取對象的類; 所以,要測試shoObject的課程,你會使用

[shoObject isKindOfClass:[NSString class]];

一旦你整理出哪些標記定義了一個空字符串或NSNumber,你就可以創建一個宏。 我通過將IsEmpty宏保存在名為CommonMacros.h的文件中來做到這一點。 這是代碼:

//Thanks Wil
//http://wilshipley.com/blog/2005/10/pimp-my-code-interlude-free-code.html

static inline BOOL IsEmpty(id thing) {
    return thing == nil
    || ([thing isEqual:[NSNull null]]) //JS addition for coredata
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}

然后,在導入CommonMacros.h之后,您可以像這樣調用函數:

if (IsEmpty(shotIndex)) {
    //do stuff
}

這應該解決這個問題,並且還可以處理字符串,數組等,正如您可以從代碼中看到的那樣。 感謝Wil Shipley!

在某些情況下,例如NSUserDefaults中缺少鍵,您將文字@“”作為空字符串返回。

這是我對NSNumber的安全檢查。

請注意,首先檢查它是否為NSNumber,因為NSNumber不理解isEqualToString

        id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"];  // don't assume is created so don't type as NSNumber*
        if ( ![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) {  

在Objective-C,它是nil不是null 所以:

if (shotIndex != nil) {
   // its not nil
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM