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

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

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

#define kCountry "Country"; 

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

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

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

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

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

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; 
  • xcode сказать не может найти ZBarSDK.h, однако это в моем проекте
  • Сбой приложения iOS при обновлении
  • Swift TableViewCell xib не имеет ограничений
  • Есть ли способ, которым кнопка Round Rect позволяет получить точно такой же размер изображения?
  • Почему я не могу найти симулятор iPhone SE в Xcode 7.3?
  • Модель сопоставления нигде не найдена (Cocoa Error 134140)
  • Отладка приложения iOS из командной строки
  • кодовый объект не подписан вообще с профилем Ad Hoc
  • Устранение заданий CocoaPods отменяет предупреждения для компиляторов
  • Swift - свойство с типом и протоколом
  • Как импортировать заголовки Swift в гибридный проект Swift / Objective-C CROSS-PLATFORM
  • Получите определенное изображение с любого URL-адреса, такого как Facebook.
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.