2015-09-28 39 views
0

我有在同一函數中在不同條件下使用兩次以上的代碼。所以我決定使用Goto語句。但該代碼將在循環內部執行。所以我不明白如何在同一個函數中調用相同的代碼。我不想創建一個更多的功能。我的代碼是...多次執行相同的代碼。如何在循環內使用Goto語句

- (void)setSelectedSearchCriteria:(NSString *)storedValue storedTag:(NSString *)storedTag D_Key:(NSString *)D_Key D_Tag_Value:(NSString *)D_Tag_Value arrayMain:(NSMutableArray *)arrayMain bgView:(UIView *)bgView 
{ 
    //Add data 
    NSMutableArray *sArray = [[storedValue componentsSeparatedByString:@","] mutableCopy]; 
    NSMutableArray *sTagArray = [[storedTag componentsSeparatedByString:@","] mutableCopy]; 

    [sArray removeObject:@""]; 
    [sTagArray removeObject:@""]; 

    int maxTag = 0; 
    if (sTagArray.count != 0) 
    { 
     maxTag = [[sTagArray valueForKeyPath:@"@max.intValue"] intValue]; 
     for (int i = maxTag + 1; i <= [D_Tag_Value intValue]; i++) 
      goto add_value; 
    } 
    else 
     goto add_value; 

    add_value: 
    { 
     NSString *D_Value = [[arrayMain objectAtIndex:[D_Tag_Value intValue]] valueForKey:PARAMETER_KEY]; 
     if (![sArray containsObject:D_Value]) 
     { 
      [sArray addObject:D_Value]; 
      [sTagArray addObject:D_Tag_Value]; 
     } 

     //Add data 
     UIButton *btn = (UIButton *)[bgView viewWithTag:[D_Tag_Value intValue]]; 
     [self setSelectedButtonStyle:btn]; 
    } 

    storedValue = [[[sArray valueForKey:KEY_DESCRIPTION] componentsJoinedByString:@","] mutableCopy]; 
    storedTag = [[[sTagArray valueForKey:KEY_DESCRIPTION] componentsJoinedByString:@","] mutableCopy]; 

    [SEARCH_CRITERIAS setValue:storedValue forKey:D_Key]; 
    [SEARCH_CRITERIAS_TAG setValue:storedTag forKey:D_Key]; 
} 

add_value中的代碼在for循環中執行,也在else部分中執行。所以我不知道如何管理這個。

+6

請不要。用通用代碼創建另一個方法。 – rmaddy

+0

我想這樣做。因爲我在sArray和sTagArray中添加了值,並且如果我創建了額外的方法,那麼我必須返回兩個數組,這是不可能的。而且我不想爲此創建兩個全局數組。 –

+0

你可以創建一個封裝兩個數組並返回的對象,但是如果你堅持要在一個函數中完成所有操作,只需計算迭代循環的次數(在count == 0的情況下爲1;您可以使用三元運算符),然後使用循環中的代碼 – Paulw11

回答

1

定義你的函數

void(^theBlock)(void) = ^(){ 
     NSString *D_Value = [[arrayMain objectAtIndex:[D_Tag_Value intValue]] valueForKey:PARAMETER_KEY]; 
     if (![sArray containsObject:D_Value]) 
     { 
      [sArray addObject:D_Value]; 
      [sTagArray addObject:D_Tag_Value]; 
     } 

     //Add data 
     UIButton *btn = (UIButton *)[bgView viewWithTag:[D_Tag_Value intValue]]; 
     [self setSelectedButtonStyle:btn]; 
}; 

我不完全明白你在做add_value裏面塊。如果可以換到塊接受一些參數和返回某個值,這將是更好的

後,您只需調用該塊

theBlock(); 
+0

我想知道,如果我使用塊,那麼它將在後臺執行或不執行?我可以傳遞參數來阻止嗎? –

+0

如果您沒有將其分派到後臺隊列,塊將不會在後臺執行。塊是你創建的東西,就像一個可變的使用像一個功能,所以當然你可以傳遞參數 – dopcn

+0

好的..謝謝..但我從來沒有工作基於塊的編碼...如果你有任何更好的鏈接,而不是提供給我。所以我可以更好地理解......我不知道如何在塊中傳遞參數。你能幫我麼? –

1

的代碼實際上並不依賴於循環計數器,所以它對代碼進行重構並不難,所以你可以簡單地執行循環適當的次數。

- (void)setSelectedSearchCriteria:(NSString *)storedValue storedTag:(NSString *)storedTag D_Key:(NSString *)D_Key D_Tag_Value:(NSString *)D_Tag_Value arrayMain:(NSMutableArray *)arrayMain bgView:(UIView *)bgView 
{ 
    //Add data 
    NSMutableArray *sArray = [[storedValue componentsSeparatedByString:@","] mutableCopy]; 
    NSMutableArray *sTagArray = [[storedTag componentsSeparatedByString:@","] mutableCopy]; 

    [sArray removeObject:@""]; 
    [sTagArray removeObject:@""]; 

    int loopCount = 1; 
    if (sTagArray.count != 0) { 
     int maxTag = [[sTagArray valueForKeyPath:@"@max.intValue"] intValue]; 
     loopCount = [D_Tag_Value intValue] - maxTag; 
    } 

    for (int i = 0; i < loopCount ; i++) { 
     NSString *D_Value = [[arrayMain objectAtIndex:[D_Tag_Value intValue]] valueForKey:PARAMETER_KEY]; 
     if (![sArray containsObject:D_Value]) 
     { 
      [sArray addObject:D_Value]; 
      [sTagArray addObject:D_Tag_Value]; 
     } 

     //Add data 
     UIButton *btn = (UIButton *)[bgView viewWithTag:[D_Tag_Value intValue]]; 
     [self setSelectedButtonStyle:btn]; 
    } 

    storedValue = [[[sArray valueForKey:KEY_DESCRIPTION] componentsJoinedByString:@","] mutableCopy]; 
    storedTag = [[[sTagArray valueForKey:KEY_DESCRIPTION] componentsJoinedByString:@","] mutableCopy]; 

    [SEARCH_CRITERIAS setValue:storedValue forKey:D_Key]; 
    [SEARCH_CRITERIAS_TAG setValue:storedTag forKey:D_Key]; 
}