2016-03-03 35 views
4

我有詢問號的NSArray數據源的方法;其中一些可能是nil,但我需要返回每個值。創建一個NSArray來表示的值,其包括零

的方法可能是這樣的:

- (NSArray *)configurationValues:(Configuration *)configuration { 
    .... 
    return [NSArray arrayWithObjects:value1, value2, value3, value4, nil]; 
} 

如果value3nil,我不得不返回{2,3,(對象是無),3}。

偏離當然,我收到了例外,因爲我無法插入nil對象

什麼我能做的就是檢查每一個對象,並插入一些空號或NSNull,但這對我來說似乎是樣板,並沒有真正優雅。

我試圖創建NSArray一個類別,它會用別的東西代替所有nil值,以避免例外:

@implementation NSArray (Nullable) 

+ (instancetype)arrayWithObjectsSafe:(id)firstObj, ... { 
    NSMutableArray *array = [NSMutableArray array]; 
    va_list args; 
    id object; 

    va_start(args, firstObj); 

    while((object = va_arg(args, id))) { 
     if (object) { 
      [array addObject:object]; 
     } else { 
      // Insert dummy element // stuck here 
      [array addObject:[NSNull null]]; 
     } 
     NSLog(@"OBJECT %@", object); 

    } 

    va_end(args); 
    return [NSArray arrayWithArray:array]; 
} 
@end 

我不是很熟悉的可變參數的方法,和我被困這裏因爲while循環跳過了nil值,所以最終數組僅包含nil之前的元素。

我能解決這個問題,或者是有NSArray現有辦法不扔試圖插入nil對象時例外嗎?

回答

4

你的代碼失敗只是因爲你正在使用nil既是你的論點結束標記和作爲的論據之一。只需使用不同的參數標記結束符。例如,你可以定義:

const id END_MARKER (__bridge id)(void *)-1; 

定義另一個恆定而不是像nil(其具有值0)。你的循環更改爲:

while((object = va_arg(args, id)) != END_MARKER) 

和您的來電:

[NSArray arrayWithObjects:value1, value2, value3, value4, END_MARKER]; 

和你的代碼工作。

HTH

0

嗯,這是行不通的。如果對象列表中存在NULL,則循環會將其作爲列表的結尾。它不會崩潰,但它也不會添加[NSNull null]。

該檢查與value1?:[NSNull null]而不是value1一樣簡單。

相關問題