Как Вы определили бы простой “минимальный” метод в obj-c

Я хочу определить минуту и макс. методы в классе Utils.

@interface Utils

int min(int a, int b);
int max(int a, int b);

@end

Но я не хочу назвать параметры. Это была бы слишком тяжелая нотация. Я хотел использовать C-определение-стилей. Но тогда [Utils min(a, b)] поскольку вызов не работает. Какова моя проблема?

Заранее спасибо за любую справку

21
задан Alex Rozanski 23 January 2010 в 23:44
поделиться

5 ответов

Так как вы не используете реализацию objective-c в OS X, то вы можете не иметь доступа к предопределенным макросам MIN и MAX.

Вы можете определить их сами как

#define MIN(a,b)    ((a) < (b) ? (a) : (b))
#define MAX(a,b)    ((a) > (b) ? (a) : (b))

Возможно, есть лучший способ определить их, но они создадут простые макросы для вашего использования. Вы можете добавить их в любой общий .h-файл, к которому обычно имеют общий доступ ваши классы.

18
ответ дан 29 November 2019 в 06:07
поделиться

Лично я использую первый стиль только для преждевременного создания исключения или возврата из метода. Как аргумент Проверка в начале функции, потому что в этих случаях, редко у меня есть более чем одно дело, и нет никогда больше.

Пример:

if (argument == null)
    throw new ArgumentNullException("argument");

if (argument < 0)
    return false;

В противном случае я использую второй стиль.

-121--717068-

Я предпочитаю использовать скобки. Добавление фигурных скобок упрощает чтение и изменение.

Вот некоторые ссылки для использования фигурных скобок:

-121--717077-

Методы класса Objective-C используют именованные параметры, период. Это всего лишь путь.

Почему бы не сделать ее глобальной, свободной функцией? Тебе не нужен класс Utils для такого рода вещей.

Если не нужно загромождать глобальное пространство имен, можно использовать Objective-C + + (переименовать все файлы .m в .mm) и поместить его в пространство имен.

1
ответ дан 29 November 2019 в 06:07
поделиться

уже определяется как макрос.

MIN(a, b)

MAX(a, b)

Вам не нужно переопределить эти.

62
ответ дан 29 November 2019 в 06:07
поделиться

Возможно, это не очень хорошая идея для данного конкретного приложения, но возможно писать методы Objective-C с параметрами "без имен", или, скорее, с именами нулевой длины:

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

(Селектор будет @selector(min::))

.
6
ответ дан 29 November 2019 в 06:07
поделиться

Существует серьезная проблема с решением, опубликованным Брэндоном Боднаром (которое на момент написания этой статьи помечено как действительное).

Проблема описана здесь: 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.

Итак, никогда не используйте наивную реализацию , как показано в приведенном выше коде (и как было предложено Брэндоном Боднаром, извини, приятель;)), если вы хотите избежать наихудших случаев, подобных этим.

29
ответ дан 29 November 2019 в 06:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: