2013-04-25 4 views
1

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

Как я могу определить ниже класс 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"; 
} 

ответ

1

Как правило, вы должны использовать правильные константы, как объяснил Калеб (+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 с (которые NSString s), в случае, если вам нужен вариант, который 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") 
}; 
4

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

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

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

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

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

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

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

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

+0

Можете ли вы дать мне пример кода. Я хочу определить все константы в классе, как указано выше, и использовать его глобально в ObjectiveC. –

+0

@AfsalMeerakutty Опять же, константы не определены в классах Objective-C. Я объяснил, как Фонд решает задачу, которую вы, кажется, описываете, поэтому, возможно, это поможет вам. Но, в общем, вы не должны ожидать, что каждая практика C# будет работать одинаково на других языках. Если бы между языками не было различий, нам не нужно было бы больше одного языка. – Caleb

+0

этот ответ не имеет смысла. В enum мы можем назначить только значения int. Я знаю, как определить константу в Objective C. Но теперь мне нужно использовать ее глобально в приложении. Поэтому я могу использовать его в любом классе –