2009-07-08 9 views
2

J'ai une question complexe qui peut être très simple pour vous guyz.Objectif C si et en ajoutant des instructions/modification NSMutableString

J'ai un

NSMutableString = "This is spinach";

J'ai 3 booléens. S'il vous plaît ignorer le code. Je n'ai pas utilisé la syntaxe appropriée, les fonctions.

if (boolA) appendstring"and apples"; 

if (boolB) appendstring"and mangoes"; 

if (boolC) appendstring"and oranges"; 

chaque booléen correspond à un fruit. Dites si BOOL a est vrai, j'ai aussi des mangues!

Quoi qu'il en soit, mon but est de formater la chaîne initiale en ajoutant les autres fruits si les booléens correspondants sont vrais et présents de façon très spécifique.

Voici le scénario si BOOL A est vrai, la chaîne devrait être "Ceci est des épinards et des mangues" Notez le "et" ajouté avec les mangues. Je peux l'ajouter tout de suite avec dépenser à la fin.

Mais le problème est quand tous les BOOLeans sont vrais. La chaîne ressemblera à "Ceci est des épinards et des pommes et des mangues et des oranges" et ce que je peux réaliser. Je veux faire ressembler à "Ceci est des épinards et des pommes, des mangues, des oranges" Notez que je veux ajouter "Et" juste une fois immédiatement après et notez les virgules "," avant les mangues et les oranges.

Je peux l'obtenir probablement, mais avec beaucoup de vérifications et ALOt d'if/else inutile.

Je pensais que je pouvais tourner jus

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

im devinant il y a une sorte de fonction que je peux utiliser pour ce faire. Comme le remplacement de la deuxième et la troisième "et" avec ",".

Pourriez-vous, s'il vous plaît, nous donner l'exemple d'une fonction comme celle-ci et un exemple pour le faire. C'était possible je pense dans le CPP de retour dans la journée .. en utilisant strpos() pour obtenir l'emplacement d'un char, puis faire quelque chose après un certain nombre et remplacer la chaîne. Ou laissez-moi savoir si theres un meilleur moyen.

Répondre

0

Je voudrais utiliser chaque bool pour ajouter la chaîne de fruits à un tableau.

items = [NSArray new]; 

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

Puis je regardais la longueur du tableau et faire la chose « bonne » pour quelle langue (anglais, français, etc.).

pseudo/cassé Code 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: @", "]; 
    } 
} 

Encore une fois, ceci est juste un code pseudo-objectif. Je vous donne juste l'essentiel plutôt que en vous donnant quelque chose que vous devriez coller dans votre système. Il y a probablement les mauvais noms de méthodes et les fuites mem avec ceci.En outre, si vous commencez à gérer le pluriel et le singulier, les choses deviennent encore plus compliquées, mais pas trop.

acclamations

2

bien une approche très simple et naïve serait:

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)]; 

Il en résulte

This is spinach and apples, mangoes 
1

est ici une solution plus propre qui utilise des tableaux au lieu de bool1 bool2 etc.

Faites un contrôle pour voir combien de booléens sont vrais (plus facile si vous mettez les dans un tableau, placez les chaînes dans un autre tableau), de sorte que vous ayez une idée de ce que vous allez produire. Le tableau de chaînes ne doit contenir que les fruits uniques et non "et" s. Vous allez avoir un bool appelé isand = false; Itérer à travers le tableau booléen, si vous obtenez un vrai, ajouter "and" + nom de fruit dans un autre tableau, et mettre l'autre bool à true. Alors vous savez pour le reste de ne pas ajouter plus "et" s.

edit: c'est difficile à comprendre, voici un code (ma syntaxe objective C ne peut pas être parfait, voire proche de la perfection, s'il vous plaît corriger mes erreurs et commentaires: 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]; 
} 
} 

J'ai probablement fait beaucoup d'erreurs horribles, mais nous espérons que vous avez l'idée: D

1

Une autre solution, cette fois en utilisant + [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";