2012-03-21 11 views
2

私は、私のコアデータをより素敵なものにし、肥大化させないようにたくさんの機能を構築しています。引数が不明な型のメソッドを宣言できますか?

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(NSString *) is { 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ = '%@')", where, is]; 

    return [self retrieveDataFrom:name withPredicate:predicate]; 
} 

、その後、時々私は(例えば)このような何かをしたい:これに代えて

[self retrieveDataFrom:@"table" where:@"id" is:int 2]; 

は、私はこのようになります方法を考えてみましょう

[self retrieveDataFrom:@"table" where:@"id" is:@"2"]; 

タイプを知らなくても引数を受け入れるメソッドを得る方法はありますか?

答えて

2

ないとのようになります。入力をNSObject *と宣言できるので、NSString *またはNSNumber *を受け取ることができますが、まだNSNumberの醜い構文を使用しています。

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]]; 

はしかし、より良い構文はClang Language Extensionsの形ですぐに来ています。

これらの土地は、あなたの代わりにこれを書くことができるようになります

:現時点では

[self retrieveDataFrom:@"table" where:@"id" is:@2]; 

は、LLVMのウェブサイトは、これらはLLVM 4.0になる予定だという。スマートマネーはこれがXcode 4.4にあると言いますが、AppleがLLVMのWebサイトの声明に従っているかどうかは疑問です。

+0

私はほとんど待つことができません。 – BoltClock

+0

私は彼らが[NSNull null]の@nullを計画しておきたいと思っています。 –

+0

これは私が探していたものでした。 NS型でBeeingすれば十分です。そこからNSNumberからintなどにコンバージョンを設定することができます。また、NSDictionaryを受け入れ、そのストア内で複数の値を受け入れることもできます。私はこの最後の夜を考えるにはあまりにも疲れていたと思う。すばらしい答えをありがとう! :) – Filibustr

1

ちょうど最高の状態で(id)代わりの(NSString *)

- (NSArray*)retrieveDataFrom:(NSString *) name where:(NSString *) where is:(id) is 
1

番号を使用し、あなたはそれがidを使用して、任意のOBJ-Cタイプを受け入れてみましょうことができますが、引数がにどんなタイプを受け入れることはできません。唯一の例外はvarargsを使用することですが、そこでさえ、メソッドは引数を調べる前にどんな型の引数があるかを知るための何らかの方法を必要とします(例えばprintf -styleメソッドは引数の型になるだろう)。

あなたがidを使用している場合は、あなたの方法は

- (NSArray *)retrieveDataFrom:(NSString *)name where:(NSString *)where is:(id)is; 

のようになります。そして、あなたの使用量が

[self retrieveDataFrom:@"table" where:@"id" is:[NSNumber numberWithInt:2]]; 

、または直接new objective-c literals

[self retrieveDataFrom:@"table" where:@"id" is:@2]; 
+0

私はまた、この操作を行うことができると思います。 idとNSObjectの使用との違いは何ですか?(または同じですか?) – Filibustr

+0

NSObjectは他のほとんどのクラスが継承し、サブクラス化されているルートクラスです。 idは単なるオブジェクトへのポインタです。Objective-Cは動的に型指定されているので、型idのオブジェクトは実行時に動的にチェックされ、渡すメッセージをサポートしているかどうかを確認します。型を設定すると、コンパイラは実行時間前にあなたのために物事をチェックすることができます。実際には、それらは似ていますが、両者の間には大きな違いがあります。 – Matias

+0

@Filibustr: 'NSObject'は最も一般的なルートクラスですが、' NSProxy'という名前の2番目のクラスがあり、必要に応じて他のクラスを作成することができます。 'id'はジェネリックな"任意のオブジェクト "ポインタです。 –

0

使用(ID)

- (NSArray*)retrieveDataFrom:(id) name where:(id) whereIs:(id)is { 
    ... 
} 

またはパス(NSArrayの*)

- (NSArray*)retrieveDataFrom:(NSArray*) params { 
    ... 
} 
+0

ええ、ちょうど私にNSArrayまたはNSDictを代わりに使用することができました。私は今夜​​これらすべての答えを試してみるでしょう。 :) – Filibustr

関連する問題