有没有什么办法让利落的Objective-C文本索引功能在Xcode 4.4?(Is there a

2019-06-26 13:51发布

我读了所有关于新的Objective-C的文字,并使用Xcode的转换我的旧代码,而是索引代码并没有改变。 我改变了它的手,但那就不是编译。 我看到一个帖子说我们要等到iOS 6的,但我想索引NOW!

有没有什么解决办法吗?

Answer 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 );
}

编辑:那么,根据关键LLVM /铛苹果电脑的工程师,有可能已经获取与实现链接库中,所以你只需要在接口文件:

日期:周一,二零一二年八月二十零日十五点16分43秒-0700来源:格雷格·帕克:...主题:回复:如何让在iOS 5的OBJ-C收集下标工作? ...

作为一个实验,我添加了这些方法的类@interface,但不是@implementation - 应用程序仍然运行得很好(至少在5.1模拟器)

编译器发出同样的呼吁。 神奇的是,在日益不准确命名libarclite(“这不只是为ARC了™”),它在运行时增加的下标方法的实现,如果他们不存在。

IIRC有一些libarclite不升级某些标,能够类(NSOrderedSet,也许?),所以你仍然需要在旧的部署目标的全面测试。



文章来源: Is there any way to get the neat Objective-C literal indexing feature in Xcode 4.4?