2016-06-19 5 views
3

デフォルトイニシャライザでジェネリックプロパティのオブジェクトを作成したいと思います。 MyProtocolにinitメソッドを追加することでこれが可能であることはわかっています。私はObjective CのiOSのジェネリックパラメータを初期化する

インタフェース

@interface CustomClass<__covariant T:id<MyProtocol>> : NSObject 

@property(nonatomic) T result; 

-(void) update; 

@end 

実装

#import "CustomClass.h" 

@implementation CustomClass 

-(void) update 
{ 
    //self.result = initialize result here 

    [self.result myMethod]; 
} 

@end 

答えて

1

Objective-Cでこの機能を実現することができます任意の方法は、遅延バインディングと動的型付けがされています。あなたはテンプレートも必要ではありません(彼らはジェネリックスと呼んでいます)、コンパイラもそれをバインドしません。単にidを使用してください。

@interface CustomClass : NSObject 
@property(nonatomic) id result; 
-(void) update; 
@end 

-(void) update 
{ 
    //self.result = initialize result here 
    [self.result myMethod]; 
} 

あなたが何らかの理由でタイプの制約を持つようにしたい場合は、単にプロトコルを使用します。

@protocol CustomProtocol 
- (void)myMethod; 
@end 

@interface CustomClass : NSObject 
@property(nonatomic) id<MyProtocol> result; 
-(void) update; 
@end 

-(void) update 
{ 
    //self.result = initialize result here 
    [self.result myMethod]; 
} 

議論のコメントで対象後:あなたがインスタンス化したい場合は

ジェネリック型の場合は、コンパイル時には実行しませんが、実行時に型を初期化子に渡すだけです。

の代わりに...:

var concrete = CustomClass<Concrete>() 

...あなたが書く:

個人的に
CustomClass *concrete = [[CustomClass alloc] initForType:[Concrete class]]; 

私は新しいアロケータを好むが、これは別の議論です。型名も文字列として渡すことができます。個人的に私はそれも好きではありません。 :-)

初期化子は、次のようになります。Objective-Cの中

- (instancetype)initForType:(Class)type 
{ 
    if((self = [super init]) 
    { 
    self.result = [type new]; 
    } 
    return self; 
} 
+0

しかし、どのように更新メソッドで結果を初期化できますか? – Gulshan

+0

?私は本当にあなたが割り当てたいものを知ることができません。タイプではなくインスタンスを割り当てる必要があります。セッターを使って値を入力するだけです。 CustomClassが初期化されたときに 'result'がプライベートで初期化されるべきですか? –

+0

CustomClassが初期化されたときに結果を初期化したい。私はそれを初期化してCustomClassに渡すことができます。私はCustomClassの結果の初期化を行うことができるかどうかを知りたいです – Gulshan

0

軽量ジェネリック医薬品は、型チェックを支援するために、純粋にコンパイル時の構文です。型チェック後に消去され、コンパイルされたコードには存在しません。実行時にはTはありません。 Tが何であるかを知る必要のあるコードを書くことはできません。

関連する問題