访问Class中的常量而不在ObjectiveC中创建类的实例[重复]
Posted
技术标签:
【中文标题】访问Class中的常量而不在ObjectiveC中创建类的实例[重复]【英文标题】:Access constants in Class without making instance of class in ObjectiveC [duplicate] 【发布时间】:2013-04-18 22:37:12 【问题描述】:下面的 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";
【问题讨论】:
【参考方案1】:如何在 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 框架中用于查找标准系统目录的方法,是使用 an enumeration,其值可以传递给多个函数或方法之一:
enum
NSApplicationDirectory = 1,
NSDemoApplicationDirectory,
NSDeveloperApplicationDirectory,
NSAdminApplicationDirectory,
NSLibraryDirectory,
NSDeveloperDirectory,
NSUserDirectory,
NSDocumentationDirectory,
NSDocumentDirectory,
//...
;
typedef NSUInteger NSSearchPathDirectory;
您将这些值中的任何一个传递到像NSSearchPathForDirectoriesInDomains()
这样的函数中。对于该特定函数,您将返回与指定目录匹配的路径数组。
【讨论】:
你能给我一个示例代码吗?我想在上面的类中定义所有常量,并在 ObjectiveC 中全局使用它。 @AfsalMeerakutty 同样,Objective-C 的类中没有定义常量。我已经解释了 Foundation 如何处理您所描述的任务,所以也许这会对您有所帮助。但是,一般来说,您不应该期望每个 C# 练习在其他语言中都以相同的方式工作。如果语言之间没有差异,我们一开始就不需要超过一种语言。 这个答案没有意义。在枚举中,我们只能分配 int 值。我知道如何在 Objective C 中定义常量。但现在我需要在应用程序中全局使用它。所以我可以在任何类中使用它 如果您想在任何课程中使用它。您可以在 .pch 文件中导入具有它的类。 哦..现在我明白了。我不想使用与 C# 中相同的类。因此,只想使用一些 .h 和 .m 文件来定义您在回答中所说的所有常量。我试图在 ObjectiveC 中实现相同的 C# 代码,而您的 cmets 让我思考 :) 感谢您帮助我。 @Caleb。【参考方案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 结构对数据进行分组。我将使用CFString
s(即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")
;
【讨论】:
以上是关于访问Class中的常量而不在ObjectiveC中创建类的实例[重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 Swift 访问 Objective-C #define 常量
Jvm(37),class文件结构-----类索引父类索引接口索引集合
JVM14_Class文件结构细节魔数Class文件版本常量池访问标识(或标志)类索引|父类索引|接口索引集合字段|方法|属性表集合