2012-03-23 5 views
2

私はこれを行うことができます:Tは任意のプリミティブ型である可能性がありObjective-Cの "Generics"でRangeValidatorを実行しますか? C#ので

class RangeValidator<T> { 
    public T MinValue { get; set; } 
    public T MaxValue { get; set; } 
} 

int,float,double ...または任意の「オブジェクト」型。 StringDateTimeなど

のObj-Cで、私はこのようにそれをしなかった場合:

@interface RangeValidator { 
    id minValue; 
    id maxValue; 
} 
@property ... 

それはのはのNSNumberやNSStringのを言わせてのために働くだろうが、私はのminValueにNSIntegerを割り当てた場合、私は思います

warning: initialization makes pointer from integer without a cast 
// Since an id is a pointer to an object, not an integer. Correct? 

代わりにNSNumberを使用することをお勧めします。このような問題に他の解決策があるのであれば、私はちょうど興味がありましたか?

ありがとうございます!

答えて

2

正しい方法は、あなたが簡単にチェックすることで検証を行うことができ、

[NSNumber numberWithInt:someInt]; 

で整数からクラスがジェネリック医薬品を必要としないこの道をNSNumberを使用して初期化することです例えばminValuemaxValue場合intValueを理解しているか(何かしたいのかによって多少の比較セレクタかもしれません)。

if([minValue respondsToSelector:@selector(intValue)]) { 
    return [minValue intValue]; 
} else { 
    .... 
} 
1

私は慣用的なObjective-Cのソリューションは、あなたが提案している正確に何もidタイプを使用してNSNumberでプリミティブ数値を包むだろうと思います。 NSInteger、コンスタンチンは、言及プリミティブ型であるとして - Foundation Data Type Referenceを参照してください。

#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
typedef long NSInteger; 
#else 
typedef int NSInteger; 
#endif 

プリミティブ型とオブジェクト間のこの矛盾は少し残念です、あなたはNSIntegerのような非オブジェクトの種類を認識することを学ぶ必要があり、CGRectCMTime

+0

ありがとうzoul!私は+ Krumelurのアドバイスを取って、NSNumberのラッピングに行きました。この場合、型なしコード( 'id minValue; id maxValue;')が醜いとコンスタンチンズの意見を共有していますか?私はそれがobj-c pplがそれを好んだ方法だと思った:) – Cotten

+0

私は可能な限り正確な型を保つのが好きだが、ここではあまりにも緩い型付けはそれほど悪くない。確かに私はObjective-C++の 'id'ソリューションを好むでしょう。 – zoul

+0

あなたのご意見ありがとうございました! – Cotten

2

Objective Cでジェネリックを使用する場合は、この醜い型のないコードの代わりにC++テンプレートをサポートするObjective C++を使用することをお勧めします。

NSIntegerがポインタ型ではなく適切なプリミティブ型のtypedefであるため、上記のコードは機能しません。代わりにNSNumberラッパーを使用する必要があります。

+0

NSNumberラッパーが提案したとしましょう...上記の型なしコード( 'id minValue; id maxValue;')がもっと醜いと思いますか?だから私はObjective-C++に入る必要があるので醜いですか? – Cotten

+0

それはあなたが醜いと思いますかによって異なります。私はタイプのない言語は間違っていると思いますが、他の人はそれほど考えないと思います:-) –

+0

あなたはありますか?私の問題は、私は今や++に入るのが面倒だということです:)しかし、提案に感謝します!それは、将来見ていく価値のあるもののように聞こえる。 – Cotten

関連する問題