Objective C if和append NSMutableString语句/修改

时间:2009-07-08 00:12:25

标签: objective-c nsstring

我有一个复杂的问题,对你来说可能非常简单。

我有一个

  

NSMutableString = "This is spinach";

我有3个布尔人。请忽略代码。我还没有使用正确的语法,函数。

if (boolA) appendstring"and apples";

 if (boolB) appendstring"and mangoes";

 if (boolC) appendstring"and oranges";

每个布尔值对应一个水果。 如果BOOL a是真的,我也有芒果!

无论如何,我的目标是通过附加其他水果来格式化初始String,如果相应的布尔值是真的并且以非常特定的方式存在。

如果BOOL A为真,那么下面是场景,字符串应该是“这是菠菜和芒果” 注意添加芒果的“和”。我可以直接添加它,最后添加。

但问题是所有BOOLeans都是真的。 字符串看起来像“这是菠菜,苹果,芒果和橘子”,这是我能实现的。

我想让它看起来像“这是菠菜和苹果,芒果,橘子” 请注意,我想在之后立即添加“And”并在芒果和橙子之前注意逗号“,”。

我可能会得到这个,但是有很多检查和ALOt不必要的if / else语句。

我在想我可以转向

"This is spinach and apples and mangoes and oranges" into 
"This is spinach and apples , mangoes , oranges".

我猜我可以使用某种功能来做到这一点。就像用“”替换第二个和第三个“”一样​​。

你们可以请知道这样的功能和一个例子吗?我认为这可能是在当天的CPP中...使用strpos()获取char的位置,然后在一定数量后执行某些操作并替换字符串。或者让我知道是否有更好的方式。

4 个答案:

答案 0 :(得分:2)

一个非常简单和天真的方法是:

NSMutableString* message = [NSMutableString stringWithCapacity:15];
[message setString:@"This is spinach"];

BOOL boolA = YES, boolB = NO, boolC = YES;

// add "and" if there are any fruits
if(boolA || boolB || boolC)
    [message appendString:@" and"];

if(boolA)
    [message appendString:@" apples,"];
if(boolB)
    [message appendString:@" oranges,"];
if(boolC)
    [message appendString:@" mangoes,"];

// remove last ","
if(boolA || boolB || boolC)
    [message deleteCharactersInRange:NSMakeRange([message length] - 1, 1)];

这导致

This is spinach and apples, mangoes

答案 1 :(得分:1)

这是一个更清洁的解决方案,它使用数组而不是bool1 bool2等。

检查有多少bool是真的(如果你把它们放在一个数组中会更容易,把字符串放在另一个数组中),这样你就可以知道你输出的是什么。字符串数组应该只包含唯一的水果而不是“和”。你将有一个名为isand = false的bool;迭代bool数组,如果你得到一个true,在其他数组中附加“and”+ fruit名称,并将另一个bool设置为true。然后你知道其余的不要添加更多的“和”。

编辑:这很难理解,这里有一些代码(我的目标C语法可能不完美,甚至接近完美,请纠正我的错误和评论:D)

bool isand=false;
NSMutableArray * strings = [NSMutableArray alloc] init];
NSMutableArray * bools = [NSMutableArray alloc] init];
NSMutableString = @"This is spinach";

//fill arrays with values

for (NSInt x=0; x<[string length]; x++) //could've used for in, but need to know which index to use in other array
{
if (b)
{
if (!isand)
{
[mystring appendString: @" and "];
isand=true;
}
[mystring appendString: [strings objectAtIndex: x];
}
}

我可能犯了许多可怕的错误,但希望你能得到这个想法:D

答案 2 :(得分:1)

另一种解决方案,这次使用+ [NSArray componentsJoinedByString:]

NSMutableArray* fruits = [NSMutableArray arrayWithCapacity:3];

if(boolA)
    [fruits addObject:@"apples"];
if(boolB)
    [fruits addObject:@"oranges"];
if(boolC)
    [fruits addObject:@"mangoes"];

NSString* message;
if([fruits count] > 0)
    message = [NSString stringWithFormat:@"This is spinach and %@", [fruits componentsJoinedByString:@", "]];
else
    message = @"This is spinach";

答案 3 :(得分:0)

我会使用每个bool将水果字符串附加到数组中。

items = [NSArray new];

if (boolA) [items append: @"apples"];
if (boolB) [items append: @"bannanas"];
if (boolC) [items append: @"cranberries"];

然后我会查看数组的长度,并为任何语言(英语,法语等)做“正确”的事情。

伪/破坏的Objc代码:

r = [NSMutableString string];
[r appendString: @"This is "];

if ([items length] == 1) {
  [r appendString: [items at: 0]];
}
if ([items length] == 2) {
  [r appendStringWithFormat: @"%@ and %@ ", [items at: 0], [items at: 1]] ;
}
if ([items length] > 2) {
  for (int i = 0; i < [items length]; i++) {    
    if (i == ([items length] - 1)) //if last
      [r appendString: @"and "];
    [r appendString: [items at: i]];
    [r appendString: @", "];
  }
}

同样,这只是客观伪代码。我只是给你一个要点,而不是 给你一些你应该粘贴到你的系统的东西。可能有 这个错误的方法名称和内存泄漏。

另外,如果你开始处理复数和单数,那么事情变得更复杂,但不会太多。

欢呼声