Перечисления в Objective-C VS C - PullRequest
4 голосов
/ 20 августа 2011

SA, я знаю, что Objective-C является строгим надмножеством C ..

Но когда я попробовал очень простой пример перечисления, который я использовал в C, он неработа в объективе C,

Вот код:

#import <Foundation/Foundation.h>

int main(void)
{
    typedef enum 
    {
        SUN, MON, TUES
    }DAYS;

    DAYS d = MON;

    NSLog(@"%@", d);

    return 0;
}

#include <stdio.h>

int main(void)
{
    typedef enum 
    {
        SUN, MON, TUES
    }DAYS;

    DAYS d = MON;

    printf("%d\n", d);

    return 0;
}

В C это работает отлично, но в target-c (я использую GNUstep на WIN)происходит сбой при выполнении (без ошибок во время компиляции)

Может кто-нибудь сказать мне, почему?

Ответы [ 5 ]

17 голосов
/ 20 августа 2011

%@ - спецификатор объекта, а перечисления - целое число (со знаком или без знака).Чтобы напечатать перечисление в Objective-C, вам нужно использовать %d в вашем NSLog.

NSLog(@"%d", d);

В вашем исходном примере произошел сбой, поскольку ожидалось, что d будет объектом, поэтому он попытается иотправить сообщение description объекту, находящемуся по адресу памяти 1 (значение MON).

3 голосов
/ 20 августа 2011

Попробуйте это

int main(void)
{
    typedef enum 
    {
        SUN, MON, TUES
    }DAYS;

    DAYS d = MON;

    NSLog(@"%d", d); //here is your mistake happened, because enum return values are integers.

    return 0;
}

Надеюсь, это поможет

2 голосов
/ 20 августа 2011

Просто используйте

NSLog(@"%d", d);

вместо

NSLog(@"%@", d);

Помните, что в Objective-C не все автоматически становится объектом.Примитивные типы в C по-прежнему просто примитивные типы.Поэтому в строке форматирования NSLog вам все равно нужно использовать тот же спецификатор, который вы всегда использовали.

2 голосов
/ 20 августа 2011

Сбой из-за оператора NSLog(@"%@"). Спецификатор формата %@ ожидает экземпляр NSObject* (или подкласс), пока вы передаете элемент enum ( т.е.

Попробуйте NSLog("%d\n", d);

0 голосов
/ 22 февраля 2013

А с помощью выражений в штучной упаковке вы можете продолжать использовать% @ в своих спецификаторах формата:

NSLog(@"%@", @(d));

Это не совсем оптимально, но на самом деле это не проблема во время отладки.Если вы сбрасываете строковые числа миллионами, используйте правильный числовой формат.

...