2

私が本当に気に入っている Java の機能の 1 つは、コンパイラがプリミティブとそのラッパー クラスを自動的に変換するオートボクシングです。

Objective-C/Cocoa で Core Data アプリケーションを作成していますが、整数属性をプログラムで処理するのが面倒です。理由は次のとおりです。

//img is a managed object that I have fetched

NSString* filename = [NSString stringWithFormat:@"image%d.png", [[img valueForKey:@"imageID"] intValue]];  

たまたまintValueメッセージを忘れてしまった場合 (時々そうします)、渡される intstringWithFormat:は実際にはポインター値です。

問題は、これが完全にサイレントに発生することです。コンパイラ エラーや警告は発生しません。このばかげた、ばかげたことが問題である場合、デバッグに時間がかかりすぎることがあります。

プログラミング スタイルやコンパイラの設定を変更して、その罠に陥らないようにする方法はありますか?

編集:上記の例は、私が問題に遭遇する多くの場所の1つにすぎないという事実について明確ではありませんでした. 文字列とは関係のない別の架空の例を次に示します。

エンティティCollegeClassには、 と の 2 つの整数属性がcourseNumberありenrollmentLimitます。コース番号を比較したいとしましょう:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

または、同様に、CS 部門のすべてのクラスの平均登録制限を計算したいとします。

4

4 に答える 4

7

%@ を使用して、%d の代わりに NSNumber を文字列に直接変換できます。

実際には NSObject ベースのクラスを取り、それを私が信じている文字列に変換します。

于 2009-12-13T22:58:22.820 に答える
3

これは Core Data を扱う場合にのみ適用できますが、MOGeneratorを使用して Core Data オブジェクトのクラスを生成する場合 (とにかくこれを行うことをお勧めします)、メソッドを使用して、 s-[propertyName]Valueを返すプロパティの正しい値に直接アクセスできます。NSNumber

// These two methods are identical when called on a class 
// which was generated with MOGenerator
[[object imageID] intValue];
[object imageIDValue];
于 2009-12-13T23:04:45.617 に答える
3

… CS 部門のすべてのクラスの平均登録制限を計算したいとします。

これは、 NSArray と NSSet の@avgoperatorで簡単に実行できます。もちろん、これは NSNumber を返すため、問題 2 に戻ります。

コース番号を比較したいとしましょう:

//classFoo is a NSManagedObjects I've fetched
if ([[classFoo valueForKey@"courseNumber"] intValue] < 400) {
    NSLog(@"undergraduate class");
}

あなたが危険にさらす問題は、intValueメッセージを省略することであり、それによって NSNumber オブジェクトidint.

コンパイラは、このような比較に対して警告を出します。-WextraXcode で、 「その他の C フラグ」ビルド設定に追加します。その他の警告オプションについては、GCC 警告の完全なリストを参照してください。

于 2009-12-14T07:32:32.190 に答える
0

「Typecheck calls to printf/ scanf」警告がオンになっていない場合は、オンにします。これは現在、NS/CFString の書式設定には役立ちませんが、そのためにレーダー拡張リクエスト (x-radar://problem/7375186) を提出しました。もちろん、ご自分でファイルしていただいてもかまいません。

于 2009-12-13T23:53:40.993 に答える