Невозможно использовать #define для удобства

Возможно, я допустил некоторые синтаксические ошибки, но я не могу понять, почему мой код не работает:

В верхней части файла .m написал:

#define kCountry "Country"; 

В этом случае я получил красное предупреждение от xCode – ожидается]

Тогда в теле функции:

  floatCountries = 74,2; [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry]; NSLog(@"%f", test); 

В этом одно – ожидаемое выражение.

Это может показаться немного глупым, но я хочу упростить свой код и использовать его, пожалуйста, помогите мне! 🙂

  • Обнаруживать, если приложение: didReceiveRemoteNotification: fetchCompletionHandler: вызывается путем нажатия на уведомление в Notification Center
  • Получение IP-адреса маршрутизатора, к которому подключен iPhone
  • коснуться наружного диапазона
  • Два интерфейса в файлах * .h и * .m
  • Почему hitTest: withEvent: вызывается три раза для каждого касания?
  • Хотите UITextView не userInteract, но узнайте ссылки на клики
  • iPhone: покупка (-а) в приложении должна быть представлена ​​с новой версией приложения
  • Преобразование строки ввода пользователя в допустимое имя файла
  • 3 Solutions collect form web for “Невозможно использовать #define для удобства”

    Использование:

     #define kCountry @"Country" 

    Вы добавили точку с запятой в конце.

    И так как это будет заменено на строковое значение, вам нужно поставить @

    Удалите полуточку с конца определения и добавьте '@':

     #define kCountry @"Country" 

    Чтобы объяснить, почему это не сработало:

    Точка с запятой

     #define kCountry "Country"; 

    В этом случае я получил красное предупреждение от xCode – ожидается]

    Нет такой вещи, как «красное предупреждение». Предупреждения желтые; ошибки красные.

    (Если вы не включите «Обработать предупреждения как ошибки», то в некотором смысле все предупреждения красные, потому что тогда они являются ошибками.)

    Так или иначе.

    Директивы препроцессора, такие как #define , не требуют точки с запятой. Если вы включите его, он станет частью директивы.

    Препроцессор заменяет любой макрос тем, что вы его определили. В этом случае вы определили макрос с именем « kCountry » со значением « "Country; ». Обратите внимание, что точка с запятой является частью значения – директива заканчивается в конце строки, а не точкой с запятой.

    Таким образом, когда вы идете использовать макрос:

     [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:kCountry]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:kCountry]; 

    Препроцессор заменяет макрос следующим образом:

     [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country";]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country";]; 

    Точка с запятой не может войти внутрь оператора; это должно произойти после. Таким образом, приведенные выше утверждения недействительны.

    Исправление состоит в том, чтобы удалить точку с запятой из строки, где #define d макрос, чтобы точка с запятой не отображалась в выходном файле:

     [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:"Country"]; 

    Кстати, у Xcode есть опция в своем баре перехода, чтобы показать вам полную препроцессорную версию кода, как это увидит компилятор. Это может быть удобно при исследовании макросов.

    Итак, это одна из проблем. Другой был …

    Тип струны, которую вы использовали

    "Country" – это строка C. Он доступен только для библиотек C и stdio (включая функции printf , strcat и т. Д.) И других API, для которых требуются строки C (такие как +[NSString stringWithUTF8String:] и +[NSString stringWithCString:encoding:] ).

    NSUserDefaults, как и все остальное в Cocoa, для которого требуется строка, требует объект строки Cocoa – NSString. Синтаксис для литерала NSString тот же, но с @ перед ним: @"Country" .

    Следовательно, версия, которая работает:

     #define kCountry @"Country" 

    Что производит предварительно обработанный вывод:

     [[NSUserDefaults standardUserDefaults]setFloat:floatCountries forKey:@"Country"]; float test= [[NSUserDefaults standardUserDefaults]floatForKey:@"Country"]; 

    Без синтаксических ошибок и правильного типа строки в обоих местах это будет версия, которая будет работать.

    О, и, как уже указывал Аноуп Вайдя,

    Синтаксис чисел

    Вы пытались присвоить номер переменной, но я думаю, вы найдете там другое число, чем ожидали.

     floatCountries = 74,2; 

    Если вы напечатаете значение этой переменной с помощью инструкции, например:

     NSLog(@"%f", floatCountries); 

    Вы увидите, что выход 2.0 .

    C имеет оператор, называемый оператором запятой, и он просто x, y , где x и y могут быть любым выражением (в идеале от типов, которые совместимы друг с другом, например, оба числа).

    Оператор запятой сначала оценивает левое выражение, затем правое выражение и сам оценивает правое выражение.

    74,2 сначала оценивает выражение 74 , а затем выражение 2 , а затем оценивает значение 2 . Таким образом, вы назначаете 2 ( int , которая автоматически преобразуется по мере необходимости) в переменную.

    Может показаться глупым использовать это с буквальными числами, и это так. Оператор запятой существует для использования с выражениями, которые имеют побочные эффекты, такие как выражения, содержащие операторы ++ и -- .

    Использование оператора запятой, как правило, не рекомендуется, потому что полученный код неясен: как правило, каждая строка должна делать одно, а строка, такая как x = ++y, --z; делает три вещи.

    Тем не менее, это действительно, как вы нашли. Однако вы должны получить предупреждение, если у вас включено предупреждение «неиспользуемое значение» (как и должно быть), потому что половина выражения, по сути, не используется, вы бросаете 74 на пол. Безвредный, но симптом, что это не то, что вы хотели сделать.

    Вы хотите:

     floatCountries = 74.2; 
    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.