7

新しいObjective-Cリテラルについてすべて読み、Xcodeを使用して古いコードを変換しましたが、インデックスコードは変更されませんでした。手作業で変更しましたが、コンパイルされませんでした。iOS 6まで待たなければならないという投稿を見ましたが、今すぐインデックスを作成したいです!

解決策はありますか?

4

1 に答える 1

21

さて、それを行う方法があります!インデックス作成メソッドをカテゴリとしてNSArrayとNSDictionaryに追加すると、必要なほとんどのクラスの機能を利用できます。ここでObjectiveCリテラルを読むことができます。そして、@YESと@NOに対するJamesWebsterのソリューションのおかげで、プロジェクトでも適切に使用できるようになりました。(テクニック)

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 / clang Appleエンジニアによると、すでに実装にリンクされているライブラリがあるので、必要なのはインターフェイスファイルだけです。

日付:2012年8月20日月曜日15:16:43 -0700差出人:Greg Parker宛先:...件名:Re:iOS 5でObj-Cコレクションの添え字を機能させる方法は?..。

実験として、これらのメソッドにカテゴリ@interfaceを追加しましたが、@implementationは追加しませんでした—アプリは引き続き正常に実行されました(少なくとも5.1シミュレーターでは)

コンパイラーは同じ呼び出しを発行します。魔法はますます不正確な名前のlibarclite( "It's Not Just For ARCAnymore™")にあり、サブスクリプトメソッドがまだ存在しない場合は実行時に実装を追加します。

IIRCには、libarcliteがアップグレードしない添え字可能なクラスがいくつかあるため(NSOrderedSet、多分?)、古い展開ターゲットで徹底的にテストする必要があります。

于 2012-07-27T19:59:54.387 に答える