Objective-C — работает со строками, находит подстроку с помощью NSRange

Я работаю со строками, и у меня есть небольшая проблема, которую я не понимаю. На самом деле у меня есть такая строка: "ALAsset - Type:Photo, URLs:assets-library://asset/asset.JPG?id=168BA548-9C81-4B08-B69C-B775E5DD9341&ext=JPG" и мне нужно найти строку между "URLs:" and "?id=" . Для этого я пытаюсь создать новую строку, используя NSRange. В этом режиме я даю первый индекс и последний индекс, который мне нужен, но, похоже, он не работает. Вот мой код:

NSString *description = [asset description];
NSRange first = [description rangeOfString:@"URLs:"];
NSRange second = [description rangeOfString:@"?id="];
NSString *path = [description substringWithRange: NSMakeRange(first.location, second.location)];

Он возвращает мне такую ​​​​строку: "URLs:assets-library://asset/asset.JPG?id=168BA548-9C81-4B08-B69C-B775E5DD9341&ext=JPG". Это правильно? Я ожидаю получить "assets-library://asset/asset.JPG" string. Что я делаю не так? Есть лучший способ сделать это? Я перешел по этому адресу для получения помощи: http://www.techotopia.com/index.php/Working_with_String_Objects_in_Objective-C

Спасибо


person Hieicker    schedule 26.08.2013    source источник
comment
Почему вы читаете такие сайты, как techtopia? Вся информация, необходимая для работы с NSString, доступна на сайте apple.com. Он содержит массу отличной информации, показывающей, как работать со строками.   -  person Abhi Beckert    schedule 26.08.2013


Ответы (3)


Не анализируйте строку описания ALAsset! Если описание когда-либо изменится, ваш код сломается. Используйте методы, которые вам предоставляют ALAsset и NSURL. Во-первых, получите словарь URL-адресов (сопоставленных по типу ресурса) с помощью метода valueForProperty:. Затем для каждого URL-адреса получите absoluteString и удалите из него строку запроса. Я получил строку, которую вы искали, поместив следующий код в метод application:didFinishLaunchingWithOptions: из шаблона приложения для iPhone с одним представлением.

ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library enumerateGroupsWithTypes:ALAssetsGroupAlbum usingBlock:^(ALAssetsGroup *group, BOOL *stop) {
   [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop) {
       NSDictionary *URLDictionary = [asset valueForProperty:ALAssetPropertyURLs];
       for (NSURL *URL in [URLDictionary allValues]) {
           NSString *URLString = [URL absoluteString];
           NSString *query = [URL query];
           if ([query length] > 0) {
               NSString *toRemove = [NSString stringWithFormat:@"?%@",query];
               URLString = [URLString stringByReplacingOccurrencesOfString:toRemove withString:@""];
               NSLog(@"URLString = %@", URLString);
           }
       }
   }];
} failureBlock:^(NSError *error) {

}];
person Carl Veazey    schedule 26.08.2013

Попробуйте этот диапазон: NSMakeRange(first.location + first.length, second.location - (first.location + first.length))

person Kirsteins    schedule 26.08.2013

NSRange first = [description rangeOfString:@"URLs:"];

дает вам позицию U, поэтому вам нужно взять first.location+5, чтобы получить начальную позицию assets-library.

NSRangeMake(loc,len) принимает начальное положение loc и длину, поэтому вам нужно использовать second.location-first.location-5, чтобы получить искомую длину.

Добавляя все это, замените последнюю строку на:

NSRange r = NSMakeRange(first.location+5, second.location-first.location-5);
NSString *path = [description substringWithRange:r];
person mvds    schedule 26.08.2013