Добавить NSString в конец каждого объекта в массиве - PullRequest
0 голосов
/ 20 сентября 2011

У меня есть такой массив:

self.youtubeVideos = [NSArray arrayWithObjects: 

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

                      nil];

Я хотел бы добавить строку NSString под названием "searchKeyword" в конец каждого объекта в массиве.

Как мне это сделать?

Спасибо!

Ответы [ 6 ]

5 голосов
/ 20 сентября 2011

Создайте изменяемый массив, затем переходите и изменяйте каждый элемент по мере продвижения.

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

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

self.youtubeVideos = fixedUrls;
2 голосов
/ 20 сентября 2011

Мое решение на основе блоков может выглядеть несколько излишним, но если у вас есть несколько из этих требований, это может быть полезно:

создать категорию на 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"];}];

Я включил этот пример в пример проекта , который я написал, чтобы научить себя основываться на блокахметоды использования функционального стиля программирования с Objective-C.Исходя из Python, я всегда скучал по списку, как

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"];}];
1 голос
/ 20 сентября 2011

Вам не нужно создавать новый массив.Вы можете заменить объекты в таблице переменных на добавленную строку:

for(int i=0;i<self.youtubeVideos.count;i++){
    [self.youtubeVideos replaceObjectAtIndex:i 
    withObject:[[self.youtubeVideos objectAtIndex:i]  
    stringByAppendingString:searchKeyword]];
}
1 голос
/ 20 сентября 2011

Вы можете добавить что-либо к существующей строке NSString с помощью

NSString* string1 = @"String1";
NSString* string2 = @"String2";
NSString* string3 = [string1 stringByAppendingString:string2];

Обратите внимание, что при этом всегда будет создаваться новая строка NSString, так как строки NSString не могут быть изменены после их создания. Для этого вам понадобится NSMutableString.

Однако ваши строки кажутся настолько похожими, что сохранение их в массиве не представляется логичным. Если единственное различие между значениями в вашем массиве - это целое число, вы можете легко создать их все, когда захотите, из шаблона String. Например, это будет использовать templateString и в следующей строке заменить% i целочисленным значением 4.

NSString* templateString = @"Ich habe %i Punkte";
NSString* scoreString = [NSString stringWithFormat:templateString, 4];
0 голосов
/ 20 сентября 2011
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];
}
0 голосов
/ 20 сентября 2011
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...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...