有没有办法在Xcode 4.4中获得整洁的Objective-C文本索引特性?

有没有办法在Xcode 4.4中获得整洁的Objective-C文本索引特性?,objective-c,cocoa-touch,xcode4.4,objective-c-literals,Objective C,Cocoa Touch,Xcode4.4,Objective C Literals,我阅读了所有关于新Objective-C文本的内容,并使用Xcode转换了我的旧代码,但索引代码没有改变。我手动更改了它,但它无法编译。我看到一篇帖子说我们必须等到iOS 6,但我现在想要索引 有什么解决办法吗?嗯,有办法!将索引方法作为一个类别添加到NSArray和NSDictionary中,您就可以获得您想要的大多数类的功能。您可以读取Objective文本。感谢詹姆斯·韦伯斯特对“是”和“否”的解决方案,你现在也可以在项目中正确使用它们了 1) 创建接口文件 // NSArray+Inde

我阅读了所有关于新Objective-C文本的内容,并使用Xcode转换了我的旧代码,但索引代码没有改变。我手动更改了它,但它无法编译。我看到一篇帖子说我们必须等到iOS 6,但我现在想要索引


有什么解决办法吗?

嗯,有办法!将索引方法作为一个类别添加到NSArray和NSDictionary中,您就可以获得您想要的大多数类的功能。您可以读取Objective文本。感谢詹姆斯·韦伯斯特对“是”和“否”的解决方案,你现在也可以在项目中正确使用它们了

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
编辑:根据一位关键的llvm/clangapple工程师的说法,有一个库已经链接到了实现中,所以您只需要接口文件:

日期:2012年8月20日星期一15:16:43-0700 发件人:格雷格·帕克 致:。。。 主题:Re:如何在iOS 5上进行Obj-C集合订阅?

作为一个实验,我为这些方法添加了category@接口,但没有添加@implementation——应用程序仍然运行良好(至少在5.1模拟器中是如此)

编译器发出相同的调用。神奇之处在于名字越来越不准确的libarclite(“这不再只是ARC的问题了™"), 这会在运行时添加订阅方法的实现(如果它们还不存在的话)


IIRC有一些可下标的类libarclite不会升级(可能是NSOrderedSet?),因此您仍然需要在较旧的部署目标上进行彻底测试。

如果您仅为ios6编译,则可以输入系统回退。(
#if!defined(u IPHONE_6_0)| uiPhone_OS_版本_MIN_REQUIRED
),请参阅:也不需要导入,因为消息是在运行时创建的。编译器不会显示警告。并且无论如何都会加载类。但是,导入可能更具可读性。我认为只有接口是必需的这一观点值得作为单独的答案(并且是正确的答案)。在扫描时,在实现块上方添加的注释不会跳出,直到我已经开始实现代码并回来检查某些内容,我才一直向下滚动。此外,这一点可能没有什么意义,但为
setObject:atIndexedSubscript:
提供的代码与描述不完全匹配
NSMutableDictionary
方法的。后者允许大于当前最高索引的索引1将数组增长1,而
replaceObjectAtIndex:withObject:
将引发异常。以下是我的(未测试)尝试修复:我想是的。两年并没有那么久,但在这种情况下,我想不会有太多其他人仍然使用iOS 5 SDK(我仍然这样做,因为当你使用目标操作系统中不可用的东西时,苹果的兼容宏不再生成警告)。无论如何,这对我还是有帮助的!谢谢!
// 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
// 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
// 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 );
}