Есть ли способ получить аккуратную функцию индексирования букв Objective-C в Xcode 4.4?

Я прочитал все о новых литералах Objective-C и использовал Xcode для преобразования моего старого кода, но индексный код не изменился. Я поменял его вручную, но потом он не скомпилировался. Я видел сообщение, в котором говорилось, что нам нужно подождать до iOS 6, но я хочу индексировать СЕЙЧАС!

Есть ли какое-либо решение?

Ответ 1

Ну, есть способ сделать это! Добавьте методы индексирования как категорию в NSArray и NSDictionary, и вы можете получить эту функцию для большинства классов, для которых вы хотите. Вы можете читать литералы ObjectiveC здесь. И благодаря решению Джеймса Вебстера для @YES и @NO вы также можете использовать их в своих проектах прямо сейчас! (техника)

1) Создайте файлы интерфейса

// NSArray+Indexing.h
#if !defined(__IPHONE_6_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
@interface NSArray (Indexing)
- (id)objectAtIndexedSubscript:(NSUInteger)idx;
@end
@interface NSMutableArray (Indexing)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;
@end
// NSDictionary+Indexing.h
@interface  NSDictionary (Indexing)
- (id)objectForKeyedSubscript:(id)key;
@end
@interface  NSMutableDictionary (Indexing)
- (void)setObject:(id)obj forKeyedSubscript:(id)key;
@end
#endif

2) Создайте файлы реализации//см. править ниже, прежде чем делать это - вы можете пропустить этот

// NSArray+Indexing.m
#if !defined(__IPHONE_6_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0
#import "NSArray+Indexing.h"
@implementation NSArray (Indexing)
- (id)objectAtIndexedSubscript:(NSUInteger)idx
{
    return [self objectAtIndex:idx];
}
@end
@implementation NSMutableArray (Indexing)
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx
{
    [self replaceObjectAtIndex:idx withObject:obj];
}
@end

// NSMutableDictionary+Indexing.m
@implementation  NSDictionary (Indexing)

- (id)objectForKeyedSubscript:(id)key
{
    return [self objectForKey:key];
}
@end
@implementation  NSMutableDictionary (Indexing)
- (void)setObject:(id)obj forKeyedSubscript:(id)key
{
    [self setObject:obj forKey:key];
}
@end
#endif

3) Добавьте файлы интерфейса в свой файл pch для глобального использования или добавьте их по мере необходимости в файлы .m.

// Add to PCH file
#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
...
#if !defined(__IPHONE_6_0) || __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_6_0

// New Indexing
#import "NSDictionary+Indexing.h"
#import "NSArray+Indexing.h"

// Provided by James Webster on StackOverFlow
#if __has_feature(objc_bool) 
#undef YES 
#undef NO 
#define YES __objc_yes 
#define NO __objc_no 
#endif 

#endif
#endif

#endif

4) Перестройте, затем добавьте следующие файлы, чтобы убедиться, что все работает

// Test Example
{

    NSMutableArray *a = [NSMutableArray arrayWithArray:@[ @"a", @"b", @"c" ]];
    NSLog(@"%@", a[1]);
    a[1] = @"foo";
    NSLog(@"a: %@", a);

    NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithDictionary:@{ @"key" : @"object" }];
    NSLog(@"%@", dict[@"key"]);

    dict[@"key"] = @"New Object";
    dict[@"newKey"] = @"WOW a new object";

    NSLog(@"dict: %@", dict);

    NSLog(@" %@ %@", @YES, @NO );
}

EDIT: Ну, по словам ключевого инженера Apple llvm/clang, есть библиотека, которая уже связана с реализациями, поэтому вам нужен только файл интерфейса:

Дата: Пн, 20 Авг. 2012 15:16:43 -0700 От: Грег Паркер Для:... Тема: Re: Как сделать подписку на Obj-C на iOS 5? ...

В качестве эксперимента я добавил категорию @interface для этих методов, но не @implementation - приложение по-прежнему работает нормально (по крайней мере, в симуляторе 5.1)

Компилятор выдает одни и те же вызовы. Магия находится во все более неточно названном libarclite ( "It not Just For ARC Anymore ™" ), который добавляет реализации методов подписи на этапе выполнения, если они еще не существуют.

IIRC есть некоторые классы, доступные для подкачки, которые libarclite не обновляет (NSOrderedSet, может быть?), поэтому вам все равно нужно тщательно протестировать старые цели развертывания.