你如何在obj-c中定义一个简单的“min”方法

我想在Utils类中定义min和max方法。

@interface Utils int min(int a, int b); int max(int a, int b); @end 

但我不想要命名参数。 这将是一个太沉重的表示法。 我想使用C风格的定义。 但是[Utils min(a, b)]作为通话不起作用。 我的问题是什么?

在此先感谢您的帮助

由于您没有使用objective-c的OS X实现,因此您可能无法访问预定义的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) 

你不需要重新定义这些。

BrandonBodnár发布的解决方案存在严重的安全问题(截至撰写本文时,该解决方案已被标记为有效解决方案)。

这里描述的问题: http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Min-and-Max.html以及它的(有效和安全)解决方案: http://gcc.gnu。组织/ onlinedocs / GCC-3.4.6 / GCC / Typeof.html

自己检查一下:

 #include  #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. 

所以永远不要使用上面代码中看到的天真实现 (并且正如BrandonBodnár所建议的,抱歉伙伴;))如果你想避免像这样的最坏情况。

对于这个特定的应用程序来说,这可能不是一个好主意,但可以使用“无名称”参数编写Objective-C方法,或者使用零长度名称编写:

 + min:(int)a :(int)b; ... [Utils min:a :b] 

(选择器是@selector(min::) 。)

Objective-C类方法使用命名参数,句点。 就是那样子。

为什么不把它变成一个全球性的免费function呢? 你不应该为这类东西需要一个Utils类。

如果您不想混淆全局命名空间,可以使用Objective-C ++(将所有.m文件重命名为.mm)并将其放在命名空间中。

在名为“XXIntegerMath.h”的模板文件中删除此…

 #import  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; } 

然后在你的目标-cclass......

 #import "XXIntegerMath.h" NSInteger minValue = imin(someValue, someOtherValue); 

它没有遭受Regexident描述的问题。