关于iphone:访问Class中的常量而不在Objective C中创建类的实例

Access constants in Class without making instance of class in ObjectiveC

本问题已经有最佳答案,请猛点这里访问。

低于C的类仅用于保持常量。所以我们可以使用类名访问每个类所以"constants.dir_archive"将给出"archive"。

我如何在客观性C级以下定义?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 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";
}


How I can define below C# class in ObjectiveC?

常量不是使用Objective-C中的类来组织的。如果要保持常量,则Objective-C中通常的方法是选择一个有意义的前缀,并将其应用于这些名称中的每一个:

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

您可以在实现(.m)文件中这样做,然后在相应的头(.h)文件中将名称声明为外部定义的常量:

1
2
3
extern NSString* const AM_DIR_ARCHIVE;
extern NSString* const AM_DIR_DEPARTMENTS;
extern NSString* const AM_DIR_FORMS;

另一种方法和用于查找标准系统目录的基础框架中使用的方法是使用枚举,其值可以传递给几个函数或方法中的一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
enum {
   NSApplicationDirectory = 1,
   NSDemoApplicationDirectory,
   NSDeveloperApplicationDirectory,
   NSAdminApplicationDirectory,
   NSLibraryDirectory,
   NSDeveloperDirectory,
   NSUserDirectory,
   NSDocumentationDirectory,
   NSDocumentDirectory,
   //...
};
typedef NSUInteger NSSearchPathDirectory;

将这些值中的任何一个传递到类似于NSSearchPathForDirectoriesInDomains()的函数中。对于这个特定的函数,您将返回一个与指定目录匹配的路径数组。


一般来说,您需要使用适当的常量,正如caleb解释的那样(+1)。

但是,将这些常量包装在类方法中(有时)很有用:

1
2
3
4
5
6
@interface MONColor : NSObject
+ (NSString *)colorName;
@end

@interface MONRedColor : MONColor
@end

蒙瑞德彩色.m

1
2
3
4
5
6
7
8
9
10
NSString * const MONColorName_Red = @"Red";

@implementation MONRedColor

+ (NSString *)colorName
{
  return MONColorName_Red;
}

@end

在某些情况下,它将通过接口智能地将类与其常量关联起来。

如果以不同的方式构建(或不构建)字符串,或者根据您所处理的类有其他逻辑要执行(例如,启用的特性或URL的组合),这也很有用。

与使用不同方法组合的函数或任意实例(常量实例)相比,在处理某些接口时,传递对象和选择器可能更容易。

在C符号上精心选择的前缀是大多数应用的理想选择。

因此,在这个问题上,您可以声明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@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

然后写:

1
NSString * resourceDirectory = [MONResourceDirectoryName Forms];

还可以使用C结构对数据分组。我将演示使用CFStrings(即NSStrings),以防您需要一个与ARC兼容的选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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")
};