2012-01-08 8 views
2

私は書き直したい小さな関数を持っているので、関数はすべてのクラスに対して有効です。 現時点では、私はすべて同じ機能を持つ同じ機能を持っていますが、すべての機能は別の機能です。 私は反射でそれをしなければならないが、私はそれをどうやって行うかについてはあまりよく分からない。 私はすでにこのリンクをお読みください。私が話してい http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.htmlIphone:反射を使って関数を置換する

機能は以下のとおりです。

-(NSCountedSet *)MissionGetReferecedNested:(id)modelObject 
{ 
    setOfObjects = [[NSCountedSet alloc]initWithArray:modelObject.MissionSectionList]; 
    return setOfObjects; 
} 
-(NSCountedSet *)MissionGetSectionReferecedNested:(id)modelObject 
{ 
    setOfObjects = [[NSCountedSet alloc]initWithArray:modelObject.DamageAccountList]; 
    return setOfObjects; 
} 

MissionSectionListとDamageAccountListは、両方の2つの異なるクラスからNSMutableArraysです。 クラスがNSMutableArrayで構成されているかどうかを確認することは可能ですか?はいの場合、それは.... modelObject.MyMutableArray?

+2

にObjCでは技術的には、そのない反射、それは実行時の型編集です。 –

答えて

2

あなたはこのようにリフレクションを使用することができます。

- (NSCountedSet *)MissionGet:(id)modelObject 
{ 
    SEL propertySelector = NULL; 

    if ([modelObject respondsToSelector:@selector(MissionSectionList)]) { 
     propertySelector = @selector(MissionSectionList); 
    } else if ([modelObject respondsToSelector:@selector(DamageAccountList)]) { 
     propertySelector = @selector(DamageAccountList); 
    } 

    if (!propertySelector) { 
     [NSException raise:@"Invalid modelObject value" format:@"Model object %@ does not contain any recognised selectors", modelObject]; 
    } 

    return [[NSCountedSet alloc] initWithArray:[modelObject performSelector:propertySelector]]; 
} 

しかし、ココアのプログラマの間でより一般的な手法は次のようになります。あなたは、プロトコルMyCustomProtocolに確認あらゆるオブジェクトを受け入れるだろう

- (NSCountedSet *)MissionGet:(id <MyCustomProtocol>)modelObject 
{ 
    return [[NSCountedSet alloc] initWithArray:[modelObject missionArray]]; 
} 

。プロトコルが使用して、どこかのヘッダファイルで定義されています

@protocol MyCustomProtocol 

@property (readonly) NSArray *missionArray; 

@end 

をそしてあなたのクラスのそれぞれに、プロトコルを実装するとして、それを宣言します。

@interface MissionSectionListClass <MyCustomProtocol> 

そして、メソッドの実装を追加:

@implementation MissionSectionListClass <MyCustomProtocol> 

- (NSArray *)missionArray 
{ 
    return self.MissionSectionList; 
} 

@end 

プロトコルの使用はもう少しコードですが、それは「正しい」方法です。 MissiongGet...メソッドを変更することなく、新しいクラスのサポートを追加することができます。プロトコルに関する

詳細情報:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProtocols.html

+0

こんにちは!ありがとうございました。私はこれがそれを行う方法かもしれないと思う。私は試してみて、プロトコルで何ができるのか見てみましょう。 – DeFlo

0

EDIT:これにすべての私の答えをクリア:

は、私はそれはクラスが指定された型のメンバ変数を持っているかどうかを確認することはできないと思います。クラスに指定されたメソッドがあるかどうかだけを確認できます。

したがって、すべてのNSMutableArrayリストを同じ名前にしてから、このリストの宣言プロパティを作成してから、あなたの... GetReferencedNestedメソッドでrespondsToSelectorを実行すると最適です。

だから、例えば、あなたのクラスのすべてに、このプロパティを作成します。

@property (nonatomic, retain) NSMutableArray * list; 

、その後..MissionGetReferencedNested方法では:私が間違っている場合

if ([modelObject respondsToSelector:@selector(list)]) 
    ... 

私を修正してください。.. 。

+0

私はこれが私が探しているものではないと思います。私の目標は、このmodelObject.MissionSectionListを書くことではありません。代わりに、私はNSMutableArrayのがあれば、私はこのクラスの多くを持っているので、これを行うにしたいと私は毎回例区別をしたいいけない...この配列を取り、modelObject.Arrayを行い、欲しいです。 – DeFlo

+0

私は最初にプロトコルでアイデアを試してみると思います。私は名前を変更することは許されないと思う。しかし、プロトコルが動作していない場合、私はあなたのアイデアを試してみます。ありがとう:) – DeFlo

+0

それは間違っています。あなたはイーバルズをチェックすることができます。 – k1th

0

スタイルの面では、私はまたAbhiの提案に従ってくださいと思います。

しかし、あなたは本当にあなたがで立ち往生しているクラスを検査したい場合や、たとえばあなたが見つけることができる最初のNSMutableArrayの変数でNSCountedSetを構築し、あなたはこのようにそれを行うことができます:もちろん

#import "Utilities.h" 
#import <Foundation/Foundation.h> 
#import <objc/objc-runtime.h> 

@implementation Utilities 

+ (NSCountedSet*)initCountedSetWithFirstArrayinObject:(id)someObject { 

    unsigned int c; 

    Ivar *ivar_arr = class_copyIvarList([someObject class], &c); 

    for (unsigned int i = 0; i < c; i++) { 
     if ([@"@\"NSMutableArray\"" isEqualToString: 
      [NSString stringWithCString:ivar_getTypeEncoding(ivar_arr[i]) encoding:NSUTF8StringEncoding] 
      ]) { 
      return [[NSCountedSet alloc] initWithArray:object_getIvar(someObject, ivar_arr[i])]; 
     } 
    } 

    return nil; 
} 

@end 

をそれは最初の配列は、あなたが興味のあるものになることを知っているあなたに依存しているため、これは非常に限られた現実世界の用途を有する

0

私は実行時の型の編集に行かなければならないと考えます(http://開発者。 apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html)

プロトコルと

アイデアは良かったが、私は私のためのクラスにたくさんのこと。(可能ではない/許可)を変更することがあります。私の意図は、関数を変更してすべてのクラスに対して1つの関数しか持たないようにすることでした。

私は、実行時の型の編集で、私は私が持っているものクラスおよび属性確認することができると思います(?)私は右ですか? 誰かがすでにランタイムタイプの編集をしていましたか?

関連する問題