将NSString添加到数组中每个对象的末尾

时间:2011-09-19 22:35:13

标签: iphone objective-c cocoa-touch

我有一个这样的数组:

self.youtubeVideos = [NSArray arrayWithObjects: 

                      @"http://example.com/index.php?number=1&keyword=", 
                      @"http://example.com/index.php?number=2&keyword=",

                      nil];

我想在数组中的每个对象的末尾添加一个名为“searchKeyword”的NSString。

我该怎么做?

谢谢!

6 个答案:

答案 0 :(得分:5)

创建一个可变数组,然后逐步修改每个元素。

NSMutableArray* fixedUrls = [NSMutableArray arrayWithCapacity:self.youtubeVideos.count];    

for (NSString* url in self.youtubeVideos)
{
    [fixedUrls addObject:[url stringByAppendingString:searchKeyword]];
}

self.youtubeVideos = fixedUrls;

答案 1 :(得分:2)

我的基于块的解决方案可能看起来有点矫枉过正,但如果你有这些要求中的一些,那么它可能会有所帮助:

在NSArray上创建一个类别:

@interface NSArray (FunctionalTools)

- (NSArray *)arrayByPerformingBlock:(id  (^)(id element))performBlock;

@end


@implementation NSArray (FunctionalTools)

- (NSArray *)arrayByPerformingBlock:(id  (^)(id element))performBlock 
{
    NSMutableArray *array = [NSMutableArray array];
    for (id element in self){
            [array addObject:performBlock(element)];
    }
    return array;
}

@end

并像这样使用它:

#import "NSArray+FunctionalTools.h"

//....

self.youtubeVideos = [NSArray arrayWithObjects: 
                                  @"http://example.com/index.php?number=1&keyword=", 
                                  @"http://example.com/index.php?number=2&keyword=",
                                  nil];

self.youtubeVideos = [youtubeVideos arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:@"KeyWord"];}];
NSLog(@"%@", youtubeVideos);

甚至

self.youtubeVideos = [[NSArray arrayWithObjects: 
                                      @"http://example.com/index.php?number=1&keyword=", 
                                      @"http://example.com/index.php?number=2&keyword=",
                                      nil] arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:@"KeyWord"];}];

我将这个例子合并到一个sample project中,我写了一篇教我自己的基于块的技术来使用Objective-C进行功能式编程。来自Python我总是错过像

这样的List Comprehension
l = ['aa', 'ab','c','ad','dd']
l = [i+i for i in l if i.startswith('a')]

基于块的看起来像这样:

NSArray *array = [NSArray arrayWithObjects:@"aa", @"ab",@"c",@"ad",@"dd", nil];
array = [array arrayByPerformingBlock:^id(id element) { return [element stringByAppendingString:element]; } 
                  ifElementPassesTest:^BOOL(id element) {return [element hasPrefix:@"a"];}];

答案 2 :(得分:1)

您可以使用

将某些内容附加到现有NSString
NSString* string1 = @"String1";
NSString* string2 = @"String2";
NSString* string3 = [string1 stringByAppendingString:string2];

请注意,这将始终创建一个新的NSString,因为NSStrings一旦创建就无法更改。为此,您需要一个NSMutableString。

但是你的字符串看起来非常相似,以至于将它们存储在数组中似乎不合逻辑。如果数组中值之间的唯一差异是整数,则可以根据需要从模板String轻松创建所有这些值。例如,这将使用templateString,并在下一行中将%i替换为整数值4。

NSString* templateString = @"Ich habe %i Punkte";
NSString* scoreString = [NSString stringWithFormat:templateString, 4];

答案 3 :(得分:1)

您不必创建新阵列。您可以使用附加的字符串替换mutablearray中的对象:

for(int i=0;i<self.youtubeVideos.count;i++){
    [self.youtubeVideos replaceObjectAtIndex:i 
    withObject:[[self.youtubeVideos objectAtIndex:i]  
    stringByAppendingString:searchKeyword]];
}

答案 4 :(得分:0)

youtubeVideos = [NSMutableArray arrayWithObjects: 
                  @"http://example.com/index.php?number=1&keyword=", 
                  @"http://example.com/index.php?number=2&keyword=",
                  nil];

for (NSString *s in youtubeVideos) {
    s = [s stringByAppendingString:@"KEYWORD"];
    // Do something with the new s here...
}

答案 5 :(得分:0)

NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"http://example.com/index.php?number=1&keyword="],[NSMutableString stringWithString:@"http://example.com/index.php?number=2&keyword="],nil];
for (NSMutableString *temp in array) {
    [temp appendString:searchKeyword];
}