4

下面的 C# 类仅用于保持常量。所以我们可以使用类名访问每个所以'Constants.DIR_ARCHIVE'将给出'Archive'。

如何在 ObjectiveC 中定义下面的 C# 类?

 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";
}
4

2 回答 2

5

如何在 ObjectiveC 中定义下面的 C# 类?

常量不是使用 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(). 对于该特定功能,您将返回与指定目录匹配的路径数组。

于 2013-04-25T06:35:47.680 回答
2

通常,您将希望使用 Caleb 解释过的正确常量 (+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 结构对数据进行分组。如果您需要与 ARC 兼容的选项,我将演示使用CFStrings(即NSStrings):

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")
};
于 2013-04-25T07:55:38.530 回答