我正在开发一个Cocoa应用程序,我使用常量nsstring作为存储我的首选项的键名的方式。

我知道这是一个好主意,因为它允许在必要时轻松更改密钥。 此外,这是整个“将数据与逻辑分离”的概念。

不管怎样,有没有一种好方法让这些常量在整个应用程序中定义一次?

我相信有一种简单而聪明的方法,但现在我的类只是重新定义它们所使用的方法。


当前回答

公认的(正确的)答案是“你可以包含这个[Constants.h]文件…在项目的预编译头中。”

作为新手,在没有进一步解释的情况下,我很难做到这一点——以下是如何做到的:pch文件(这是Xcode中预编译头文件的默认名称),在#ifdef __OBJC__块中导入Constants.h。

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

还要注意Constants.h和Constants.h。M文件中除了已接受的答案中描述的内容外,绝对不应该包含任何其他内容。(没有接口或实现)。

其他回答

// Prefs.h
extern NSString * const RAHUL;

// Prefs.m
NSString * const RAHUL = @"rahul";

如果你想调用nsstring。newline;从objective c,你想要它是静态常量,你可以在swift中创建这样的东西:

public extension NSString {
    @objc public static let newLine = "\n"
}

这样你就有了很好的可读的常量定义,并且可以从你选择的类型中获得,同时还可以绑定到类型的上下文。

公认的(正确的)答案是“你可以包含这个[Constants.h]文件…在项目的预编译头中。”

作为新手,在没有进一步解释的情况下,我很难做到这一点——以下是如何做到的:pch文件(这是Xcode中预编译头文件的默认名称),在#ifdef __OBJC__块中导入Constants.h。

#ifdef __OBJC__
  #import <UIKit/UIKit.h>
  #import <Foundation/Foundation.h>
  #import "Constants.h"
#endif

还要注意Constants.h和Constants.h。M文件中除了已接受的答案中描述的内容外,绝对不应该包含任何其他内容。(没有接口或实现)。

尝试使用类方法:

+(NSString*)theMainTitle
{
    return @"Hello World";
}

我有时会用。

如果你喜欢命名空间常量,你可以使用struct,周五问答2011-08-19:命名空间常量和函数

// in the header
extern const struct MANotifyingArrayNotificationsStruct
{
    NSString *didAddObject;
    NSString *didChangeObject;
    NSString *didRemoveObject;
} MANotifyingArrayNotifications;

// in the implementation
const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = {
    .didAddObject = @"didAddObject",
    .didChangeObject = @"didChangeObject",
    .didRemoveObject = @"didRemoveObject"
};