どのようにあなたはOBJ-Cでシンプルな「分」メソッドを定義します
-
22-09-2019 - |
質問
私はUtilsのクラスで最小と最大のメソッドを定義したい。
@interface Utils
int min(int a, int b);
int max(int a, int b);
@end
しかし、私は名前付きパラメータを持っている必要はありません。それはあまりにも重い表記になります。私はCスタイルの定義を使用していました。呼び出しが仕事をしないようしかし、その後[Utils min(a, b)]
。私の問題は何ですか?
任意の助けを事前に感謝します。
解決
は、事前に定義されたMINとMAXのマクロへのアクセス権を持っていない可能性があります。
は、
としてこれらを自分で定義することができます#define MIN(a,b) ((a) < (b) ? (a) : (b))
#define MAX(a,b) ((a) > (b) ? (a) : (b))
は、それらを定義するためのより良い方法はおそらくありますが、これらは、あなたの使用のための簡単なマクロを作成します。あなたは、あなたのクラスは、通常、共有そのいずれかの一般的な.hファイルにそれらを追加することができます。
他のヒント
はこれは既にマクロとして定義されます。
MIN(a, b)
MAX(a, b)
あなたはこれらのものを再定義する必要がいけない。
(この記事の執筆時点で有効な解決策としてマークされている)ブランドンBodnarさんによって投稿溶液で深刻な問題があります。
問題は、ここで説明する:のhttp:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Min-and-Max.htmlする そして、それまで(有効&安全な)解決策:のhttp:/ /gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Typeof.htmlする
自分でそれをチェックアウト:
#include <stdio.h>
#define NAIVE_MAX(a,b) (a > b ? a : b)
#define NAIVE_MIN(a,b) (a < b ? a : b)
#if !defined MAX
#define MAX(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a > __b ? __a : __b; })
#endif
#if !defined MIN
#define MIN(a,b) \
({ __typeof__ (a) __a = (a); \
__typeof__ (b) __b = (b); \
__a < __b ? __a : __b; })
#endif
int main (int argc, const char * argv[]) {
int a = 3;
int b = 5;
#pragma mark NON-FATAL CASES:
printf("NAIVE_MAX(%d, %d) => %d\n", a, b, NAIVE_MAX(a, b));
printf("NAIVE_MIN(%d, %d) => %d\n", a, b, NAIVE_MIN(a, b));
printf("MAX(%d, %d) => %d\n", a, b, MAX(a, b));
printf("MIN(%d, %d) => %d\n", a, b, MIN(a, b));
printf("\nEverything fine so far...\n\n");
#pragma mark FATAL CASES:
//cache:
int _a = a;
int _b = b;
printf("NAIVE_MAX(%d++, %d++) => %d\n", _a, _b, NAIVE_MAX(a++, b++));
//reset:
a = _a;
b = _b;
printf("NAIVE_MIN(%d++, %d++) => %d\n", _a, _b, NAIVE_MIN(a++, b++));
//reset:
a = _a;
b = _b;
printf("NAIVE_MAX(++%d, ++%d) => %d\n", _a, _b, NAIVE_MAX(++a, ++b));
//reset:
a = _a;
b = _b;
printf("NAIVE_MIN(++%d, ++%d) => %d\n", _a, _b, NAIVE_MIN(++a, ++b));
printf("\nOuch, this doesn't look right at all!\n\n");
#pragma mark NON-FATAL CASES:
//reset:
a = _a;
b = _b;
printf("MAX(%d++, %d++) => %d\n", _a, _b, MAX(a++, b++));
//reset:
a = _a;
b = _b;
printf("MIN(%d++, %d++) => %d\n", _a, _b, MIN(a++, b++));
//reset:
a = _a;
b = _b;
printf("MAX(++%d, ++%d) => %d\n", _a, _b, MAX(++a, ++b));
//reset:
a = _a;
b = _b;
printf("MIN(++%d, ++%d) => %d\n", _a, _b, MIN(++a, ++b));
printf("\nAh, much better now.\n\n");
return 0;
}
コンソールログます:
NAIVE_MAX(3, 5) => 5
NAIVE_MIN(3, 5) => 3
MAX(3, 5) => 5
MIN(3, 5) => 3
Everything fine so far...
NAIVE_MAX(3++, 5++) => 6
NAIVE_MIN(3++, 5++) => 4
NAIVE_MAX(++3, ++5) => 7
NAIVE_MIN(++3, ++5) => 5
Ouch, this doesn't look right at all!
MAX(3++, 5++) => 5
MIN(3++, 5++) => 3
MAX(++3, ++5) => 6
MIN(++3, ++5) => 4
Ah, much better now.
だから、を決して上記のコードに見られるように、の素朴な実装を使用(とブランドンBodnarさん、ごめんバディによって示唆されるように;)。)あなたはこのような最悪のケースを回避したい場合は、
これはおそらく、この特定のアプリケーションのための良いアイデアではありませんが、それは、の可能性の「名前なし」のパラメータを持つObjective-Cのメソッド、またはむしろゼロの長さの名前を持つを書くことです。
+ min:(int)a :(int)b;
...
[Utils min:a :b]
(セレクタ@selector(min::)
であろう。)
Objective-Cのクラスのメソッドは、名前付きパラメータ、ピリオドを使用します。それはそれがあるだけの方法です。
なぜグローバル、フリー機能しませんか?あなたはこの種のもののためのUtilsクラスは必要ありません。
あなたがグローバル名前空間を乱雑にしたくない場合は、、あなたは(.mmへのすべての.mファイルの名前を変更)のObjective-C ++を使用して名前空間にそれを置くことができます。
"XXIntegerMath.h" このドロップ...
という名前のテンプレートファイルで#import <Foundation/Foundation.h>
static inline NSInteger imax(NSInteger a, NSInteger b) {
return a > b ? a : b;
}
static inline NSInteger imin(NSInteger a, NSInteger b) {
return a < b ? a : b;
}
次に、あなたのObjective-Cのクラスで...
#import "XXIntegerMath.h"
NSInteger minValue = imin(someValue, someOtherValue);
これはRegexidentによって記述問題に悩まされていません。