Доступ к константам в классе без создания экземпляра класса в ObjectiveC

Ниже класс C# используется только для сохранения констант. Таким образом, мы можем получить доступ к каждому, используя имя класса. Таким образом, "Constants.DIR_ARCHIVE" даст "Архив".

Как я могу определить ниже C# класс в ObjectiveC?

 public class Constants
{
//Resource Directory Names
public const string DIR_ARCHIVE = "Archive";
public const string DIR_DEPARTMENTS = "Departments";
public const string DIR_FORMS = "Forms";
public const string DIR_GOAL_TRACKING = "GoalTracking";
public const string DIR_ROLES = "Roles";
public const string DIR_HOMEWORK = "HomeWork";
public const string DIR_POSTINGS = "Postings";
public const string DIR_SIGNUP = "SignUp";
public const string DIR_SITE_CONFIG = "System";
public const string DIR_PORTFOLIO = "Portfolio";
public const string DIR_MEMBERDEFINITION = "Definitions";

//Integer Constants 
public const int LOG_DEFAULT_DURATION = 1;

//Other Constants
public const string OP_STATUS_ERROR = "Error";
public const string OP_STATUS_SUCCESS = "Success";
public const string OP_STATUS_WARNING = "Warning";
}

2 ответа

Решение

Как правило, вы захотите использовать правильные константы, как объяснил Калеб (+1).

Однако может быть (иногда) полезно обернуть эти константы в методы класса:

@interface MONColor : NSObject
+ (NSString *)colorName;
@end

@interface MONRedColor : MONColor
@end

MONRedColor.m

NSString * const MONColorName_Red = @"Red";

@implementation MONRedColor

+ (NSString *)colorName
{
  return MONColorName_Red;
}

@end

В некоторых случаях будет разумно связывать класс с его константами через интерфейс.

Это также может быть полезно, если строки построены (или нет) по-разному, или есть дополнительная логика для выполнения (например, включенные функции или состав URL-адресов) - в зависимости от класса, с которым вы имеете дело.

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

Хорошо выбранный префикс на символе C идеально подходит для большинства случаев.

Итак, подробно остановившись на этом, вы можете заявить:

@interface MONResourceDirectoryName : NSObject

+ (NSString *)Archive;
+ (NSString *)Departments;
+ (NSString *)Forms;
+ (NSString *)GoalTracking;
+ (NSString *)Roles;
+ (NSString *)HomeWork;
+ (NSString *)Postings;
+ (NSString *)SignUp;
+ (NSString *)System;
+ (NSString *)Portfolio;
+ (NSString *)Definitions;

@end

затем написать:

NSString * resourceDirectory = [MONResourceDirectoryName Forms];

Вы также можете использовать структуры C для группировки данных. Я продемонстрирую, используя CFStringс (которые NSStrings), если вам нужна опция, совместимая с ARC:

struct t_mon_resource_directory_name {
    CFStringRef const Archive;
    CFStringRef const Departments;
    CFStringRef const Forms;
    CFStringRef const GoalTracking;
    CFStringRef const Roles;
    CFStringRef const HomeWork;
    CFStringRef const Postings;
    CFStringRef const SignUp;
    CFStringRef const System;
    CFStringRef const Portfolio;
    CFStringRef const Definitions;
};

extern const struct t_mon_resource_directory_name MONResourceDirectoryName;

const struct t_mon_resource_directory_name MONResourceDirectoryName = {
    .Archive = CFSTR("Archive"),
    .Departments = CFSTR("Departments"),
    .Forms = CFSTR("Forms"),
    .GoalTracking = CFSTR("GoalTracking"),
    .Roles = CFSTR("Roles"),
    .HomeWork = CFSTR("HomeWork"),
    .Postings = CFSTR("Postings"),
    .SignUp = CFSTR("SignUp"),
    .System = CFSTR("System"),
    .Portfolio = CFSTR("Portfolio"),
    .Definitions = CFSTR("Definitions")
};

Как я могу определить ниже C# класс в ObjectiveC?

Константы не организованы с использованием классов в Objective-C. Если они остаются постоянными, обычный подход в Objective-C будет состоять в том, чтобы выбрать значимый префикс и применить его к каждому из этих имен:

NSString* const AM_DIR_ARCHIVE = "Archive";
NSString* const AM_DIR_DEPARTMENTS = "Departments";
NSString* const AM_DIR_FORMS = "Forms";

Вы сделаете это в файле реализации (.m), а затем объявите имена как внешние константы в соответствующем файле заголовка (.h):

extern NSString* const AM_DIR_ARCHIVE;
extern NSString* const AM_DIR_DEPARTMENTS;
extern NSString* const AM_DIR_FORMS;

Другой подход, который используется в среде Foundation для поиска стандартных системных каталогов, заключается в использовании перечисления, значение которого может быть передано одной из нескольких функций или методов:

enum {
   NSApplicationDirectory = 1,
   NSDemoApplicationDirectory,
   NSDeveloperApplicationDirectory,
   NSAdminApplicationDirectory,
   NSLibraryDirectory,
   NSDeveloperDirectory,
   NSUserDirectory,
   NSDocumentationDirectory,
   NSDocumentDirectory,
   //...
};
typedef NSUInteger NSSearchPathDirectory;

Вы передаете любое из этих значений в функцию, такую ​​какNSSearchPathForDirectoriesInDomains(), Для этой конкретной функции вы получите массив путей, которые соответствуют указанному каталогу.

Другие вопросы по тегам