Dec
25
2011

Improved componentsJoinedByString:



Comments available as RSS 2.0

To format list of categories, ingredients etc in a more readable way for ChickenPing, I use a function which joins a list of strings using a separator and a final separator. Eg:

    NSArray *items = [[NSArray alloc] initWithObjects:@"Item1", @"Item2", @"Item3", nil];
    NSString *joined = [Utils implode:items withSeperator:@", " trimStrings:true lastSeparator:@" and "];
    // returns "Item1, Item2 and Item3"

It’s more flexible than NSArraycomponentsJoinedByString: because it includes an optional last separator and the option to trim strings. Code is below.

/// <summary>
/// Joins a list using a separator.
/// </summary>
/// <param name="items">The list to join.</param>
/// <param name="separator">The separator to use.</param>
/// <param name="trim">If set to <c>true</c>, trims whitespace from each index.</param>
/// <returns>A string containing the values separated by the separator</returns>
+(NSString*)implode:(NSArray*)items withSeperator:(NSString*)separator trimStrings:(bool)trim {
    return [Utils implode:items withSeperator:separator trimStrings:trim lastSeparator:separator];
}
 
/* <summary>
 *  Joins a list using a separator.
 * </summary>
 * <param name="items">The list to join.</param>
 * <param name="separator">The separator to use.</param>
 * <param name="trim">If set to <c>true</c>, trims whitespace from each index.</param>
 * <param name="lastSeparator">The separator to use to join the second to last and last item, or <c>null</c> to use the separator. Eg: Could be "and".</param>
 * <returns>A string containing the values separated by the separator</returns>
 */
+(NSString*)implode:(NSArray*)items withSeperator:(NSString*)separator trimStrings:(bool)trim lastSeparator:(NSString*)separatorForLastItem {
    NSMutableString *buffer = [[NSMutableString alloc] init];
    int num = [items count],
        added = 0;
    for (NSString *item in items) {
            [buffer appendString:trim ? [item stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]
                                      : item];
        if (added + 1 < num) {
            if (added == num - 2 && separatorForLastItem != nil) {
                [buffer appendString:separatorForLastItem];
            } else {
                [buffer appendString:separator];
            }
        }
        added++;
    }
    return [buffer copy];
}

Comments

Leave a Comment

Login using OpenID or enter your details below to leave a comment.

OpenID
Anonymous


Comment