stringByAppendingString not concatenating - ios

I'm trying to take an array of strings and take each item and put it into a string format. I wrote a method to do this as I need to concatenate the listed array values into another string. For some reason I cannot get the array values to list properly, a blank string is returned.
- (NSString*)listParameters:(NSArray*)params
{
NSString *outputList = #"";
if (params) {
for (int i=0; i<[params count]; i++) {
NSLog(#"%#",[params objectAtIndex:i]);
[outputList stringByAppendingString:[params objectAtIndex:i]];
if (i < ([params count] - 1)) {
[outputList stringByAppendingString:#", "];
}
}
}
NSLog(#"outputList: %#", outputList);
return outputList;
}
The first log statement properly returns a string (so there is definitely a string in the array), but the second log statement only returns "outputList: ".
I tried making outputList start as more than just an empty string which didn't work. I also tried assigning [params objectAtIndex:i] to a string then appending it, didn't work either.
I feel like I'm missing something obvious here, but I cannot get it to work.
How can I get this array of strings to print into a single string separated by commas?

You probably want to use a NSMutableString instead with its appendString method. NSString is immutable.
- (NSString*)listParameters:(NSArray*)params
{
NSMutableString *outputList = [[NSMutableString alloc] init];
if (params) {
for (int i=0; i<[params count]; i++) {
NSLog(#"%#",[params objectAtIndex:i]);
[outputList appendString:[params objectAtIndex:i]];
if (i < ([params count] - 1)) {
[outputList appendString:#", "];
}
}
}
NSLog(#"outputList: %#", outputList);
return outputList;
}

You need to assign the result of [outputList stringByAppendingString:[params objectAtIndex:i]] and [outputList stringByAppendingString:#", "] back to outputList.
It would be better still if you were using an instance of NSMutableString for outputList instead, as you're going to create a lot of autoreleased objects in that loop otherwise.

Try:
outputList = [outputList stringByAppendingString:#", "];
as stringByAppendingString works by returning a new String

Related

How can I change substring(s) in an array of strings in Objective-C?

I have a weird error with decoding & sign so its always shown as &, so && will be &&, a&b is shown as a&b etc.
I have those weird characters in my array of strings sometimes, so I want to remove them. To be more clear, if I have an array like this:
"str1", "a&b", "12345", "d&&emo&"
I want to it to be:
"str1", "a&b", "12345", "d&&emo&"
So all & should be changed into just &.
This is the code I tried, but it didn't help. Elements are not changing their values:
for (int i = 0; i <= self.array-1; i++)
{
NSLog(#"%#", self.array[i]);
[self.array[i] stringByReplacingOccurrencesOfString:#"&" withString:#"&"];
NSLog(#"%#", self.array[i]);
}
I am new to Objective-C.
NSString instances are immutable, which means you can't change them once they are created. The stringByReplacingOccurencesOfString:withString: method actually returns a new NSString instance. You could use NSMutableString, or alternatively, you can create a new array containing the replacement strings, e.g.:
NSMutableArray *newArray = [NSMutableArray array];
for (NSString *input in self.array)
{
NSString *replacement = [input stringByReplacingOccurrencesOfString:#"&" withString:#"&"];
[newArray addObject:replacement];
}
self.array = newArray;

How to store value in array?

lookupAllForSQL is a database function.
The table name and identifier are dynamic.
for (int i=0; i<FavIdent.count; i++)
{
NSString *strfavarry = [NSString stringWithFormat:#"SELECT Title FROM %# WHERE identifire='%#'",[FavTablename objectAtIndex:i],[FavIdent objectAtIndex:i]];
FavTitle = [FavData lookupAllForSQL:strfavarry];
}
FavTitle should retain only last row found, but I want all the indicated columns.
lookupAllForSQL is returning an array, so the value you store in FavTitle (which should be favTitle - variables start with a lower case letter by convention) is being replaced each time, resulting in the last value being left after the loop exits.
You need to use an NSMutableArray and append the sub-array each time through the loop:
NSMutableArray *tempArray = [NSMutableArray new];
for (int i=0; i<FavIdent.count; i++)
{
NSString *strfavarry = [NSString stringWithFormat:#"SELECT Title FROM %# WHERE identifire='%#'",[FavTablename objectAtIndex:i],[FavIdent objectAtIndex:i]];
[tempArray addObjectsFromArray:[FavData lookupAllForSQL:strfavarry]];
}
favTitle = [tempArray copy]; // Convert it back to an NSArray
You should also use prepared SQL statements rather than string interpolation to guard against SQL injection.
In your current code you are assigning the result array from [FavData lookupAllForSQL:strfavarry] to FavTitle in the for loop. So FavTitle must always have last result array in it when the for loop executed.
use below code
NSArray *result = [FavData lookupAllForSQL:strfavarry];
if(result){
[FavTitle addObject:[result objectAtIndex:0]];
}

NSMutableString is null after appending

I am trying to build an array of strings which will be added to an XML soap request.
I have a simple loop to build the array:
MarcTagsList is an NSArray of strings which contains the values ["82a","100a","245b","520a"] and is passed as a parameter.
NSMutableString *xmlTagList;
for(i=0; i<numberOfTags; i++)
{
[xmlTagList appendFormat:#"<string>%#</string>",MarcTagList[i]];
NSLog(#" appending - <string>%#</string>",MarcTagList[i]);
}
The log output shows the loop and MarcTag values are OK, however when the loop is complete
NSLog(#"xmlTagList %#", xmlTagList);
Shows xmlTagList to be null.
Firstly intialize xmlTagList string
//allocated
NSMutableString *xmlTagList=[[NSMutableString alloc] init];
OR
//auto-referenced
NSMutableString *xmlTagList=[NSMutableString string];
OR
//auto-referenced
NSMutableString *xmlTagList=[NSMutableString new];
OR
//auto-referenced
NSMutableString *xmlTagList= #"";
Now use xmlTagList for further requirement ie append operation
for(i=0; i<numberOfTags; i++)
{
[xmlTagList appendFormat:#"<string>%#</string>",MarcTagList[i]];
NSLog(#" appending - <string>%#</string>",MarcTagList[i]);
}
Change:
NSMutableString *xmlTagList;
to:
NSMutableString *xmlTagList = [NSMutableString stringWithString:#""];

How to add values or add object into NSArray in Objective C using for loop?

Well this is my code:
NSDictionary *dicto;
NSString *ndccode;
NSString *string=#" ";
for (int i=0; i<array.count; i++) {
dicto=[array objectAtIndex:i];
ndccode=[dicto objectForKey:#"NDCCode"];
string=[string stringByAppendingString:ndccode];
string=[string stringByAppendingString:#"\n"];
NSLog(#"%#",string);
}
NSLog(#"%#",string);
In the above code, i have values in dicto nsdictionary which loops one by one value and assigns to ndccode which is string. Then I am adding to string so that I can append it to the next line.
output :
name1
name2
name3
.....
Instead of assigning to the string. I want to assign it to an array.Could you please tell me how to assign it to an array for this example,since it is in loop. I want to use the array for later purposes.
Thank you in advance.
NSDictionary *dicto;
NSString *ndccode;
NSMutableArray *outputArray=[NSMutableArray new];
for (int i=0; i<array.count; i++) {
dicto=[array objectAtIndex:i];
ndccode=[dicto objectForKey:#"NDCCode"];
[outputArray addObject:ndccode];
}
or even more succinctly
NSArray *outputArray = [array valueForKey:#"NDCCode"];

Parsing JSON data and handling an Array

I am using Mantle to parse some JSON data from Yelp.
For each business returned I get an NSArray of categories. This would be an example:
yelpCategories = (
(
"Wine Bars",
"wine_bars"
),
(
"Ice Cream & Frozen Yogurt",
icecream
)
);
yelpCategories is the name of the array that I save. Later on I am trying to parse the array into a string:
NSMutableString *yelpCats = [[NSMutableString alloc] init];
for (NSObject * obj in business.yelpCategories)
{
[yelpCats appendString:[NSString stringWithFormat:#"%#,",[obj description]]];
}
The issue is with the above. I am being returned a string just as "(" so I must be accessing the array incorrectly. How can I correctly access each object, ideally I would be looking for the end string o be #"Wine Bars, Ice Cream & Frozen Yogurt".
EDIT
The categories array: (
(
Pubs,
pubs
)
)
FINAL EDIT - Proposed Solution
for (NSArray *cats in business.yelpCategories)
{
NSString *category = [cats objectAtIndex:0];
if ([category length] > 0) {
category = [category substringToIndex:[category length] - 1];
}
if (cats == business.yelpCategories.lastObject) {
[yelpCats appendString:[NSString stringWithFormat:#"%#",category]];
} else {
[yelpCats appendString:[NSString stringWithFormat:#"%#, ",category]];
}
}
cell.yelpCategories.text = yelpCats;
Using the description of the object gives you what you see in the debugger, which includes extra carriage returns.
What you want to do is something like:
yelpCats = [yelpCategories componentsJoinedByString:#", "];
#jeffamaphone 's answer is the correct and best way of doing things however what your doing will almost work, I think your just confused on the contents of the array.
The yelpCategories array is an array of strings so you don't need to call stringWithFormat or call the description method. In fact [obj description] will return a string so you didn't even need stringWithFormat in your example and you would have gotten the same output. To make your original method work change to:
NSMutableString *yelpCats = [[NSMutableString alloc] init];
for (id obj in business.yelpCategories)
{
//obj is a string so we can just append it.
[yelpCats appendString:obj]];
}
Also noticed I changed NSObject *obj to just id obj, this is the idiomatic way and shorthand way of declaring NSObjects in objective-c. In this example however I would actually use (NSString *category in business.yelpCategories) instead for better readability. In this case you are declaring to everyone that you expect each object in the array to be a string and then if you wanted to use NSString methods on it inside the loop then you don't have to cast it.
for (NSArray *cats in business.yelpCategories)
{
NSString *category = [cats objectAtIndex:0];
if ([category length] > 0) {
category = [category substringToIndex:[category length] - 1];
}
if (cats == business.yelpCategories.lastObject) {
[yelpCats appendString:[NSString stringWithFormat:#"%#",category]];
} else {
[yelpCats appendString:[NSString stringWithFormat:#"%#, ",category]];
}
}
cell.yelpCategories.text = yelpCats;

Resources