Nano Hash - криптовалюты, майнинг, программирование

iOS: лучший способ иметь глобальную строку - как для имени уведомления

Я продолжаю читать разные вещи об этом, и это кажется опасно запутанным. Может ли кто-нибудь сказать мне правильный шаблон для определения строк уведомлений, которые можно использовать глобально? Все, что я пробовал, вызывало ошибки компоновщика. Например, в моем синглтоне GlobalVariables я добавил:

#import <Foundation/Foundation.h>
extern NSString *kMPTimeChanged;

@interface GlobalVariables : NSObject etc. 

И затем в инициализации:

@implementation GlobalVariables

#pragma mark Singleton Methods

+ (id)sharedGlobals {
    static GlobalVariables *sharedGlobals = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedGlobals = [[self alloc] init];

    });
    return sharedGlobals;
}

- (id)init {
    if (self = [super init]) {

      kMPTimeChanged=@"kMPTimeChanged";

    return self;
}

Он не построился, я получил несколько ошибок.



Ответы:


1

В вашем файле .h вы должны написать:

extern NSString * const kMPTimeChanged;

В вашем .m файле вы должны написать:

NSString * const kMPTimeChanged = @"My Constant";

Оба они должны быть за пределами ваших блоков @interface и @implementation.

01.11.2013
  • Я добавлю, что с этим простым решением нет необходимости в классе (если только он не служит другим целям). Просто есть две строчки и все. 01.11.2013

  • 2

    Я бы рекомендовал объявлять ваши переменные как const extern. Потом:

    // Globals.h
    extern NSString * const kMPTimeChanged;
    
    // Globals.m
    NSString * const kMPTimeChanged = @"...";
    
    01.11.2013
  • См. этот пост о разнице между const NSString * и NSString const *. Объект типа NSString уже является неизменяемым, поэтому нет необходимости использовать const, как вы это делали. 01.11.2013
  • @Нил Ага. Опечатка. Я исправил. 01.11.2013

  • 3

    Если ваши значения являются константами, просто используйте заголовок, например, с именем Constants.h. В этом заголовке вы можете объявить константы следующим образом:

    #define kMPTimeChanged @"kMPTimeChanged"
    
    01.11.2013
  • #define — это красиво и просто, и я признаю, что использую его снова и снова, но обычно мне нужен свой тип данных. 01.11.2013
  • @DBD: Что вы имеете в виду, хотите мой тип данных? 01.11.2013
  • Константа безопасна для типов, но замена #define происходит перед компиляцией (по сути, как поиск и замена), поэтому вы можете изменить @fubar на 37. Скорее всего, позже это вызовет проблемы, но вы об этом не знаете. Если вы попытаетесь сделать это с помощью константы, она предупредит вас еще до того, как вы закончите ее печатать. 01.11.2013
  • Это работает для меня, это простой способ объявить константу :) @Linuxios 29.10.2015

  • 4

    Мне не нравятся переменные extern. Иногда трудно понять, откуда они взялись, и мне приходится искать в больших базах кода переменные с плохими именами, которые, кажется, существуют ниоткуда. Я предполагаю, что я вроде как в глобальных переменных есть злая толпа. Тем не менее, они полезны, поэтому у меня есть собственное решение.

    Мое решение - это простой класс Constants с кучей статических методов, свойств и всего, что необходимо (все, конечно, только для чтения). Проблема в том, что вы застряли, импортируя этот класс повсюду! Однако есть простое решение.

    При импорте в файле project-Prefix.pch. Это будет автоматически добавлено ко всему вашему коду, и вы сможете использовать свои константы и по-прежнему знать, откуда они берутся, не задумываясь об этом.

    Вот пример моего файла project-Prefix.pch.

    #import <Availability.h>
    
    #ifndef __IPHONEserverUrl0
    #warning "This project uses features only available in iOS SDK 5.0 and later."
    #endif
    
    #ifdef __OBJC__
        #import <UIKit/UIKit.h>
        #import <Foundation/Foundation.h>
        #import <CoreData/CoreData.h>
    
        #import "Constants.h"
    #endif
    

    Теперь вы получаете доступ к Constants.serverUrl из любого места и точно знаете, откуда взялся serverUrl.

    01.11.2013
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..