2015-09-28 42 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]; 
}