【问题标题】:How to declare and use NSString global constants [duplicate]如何声明和使用 NSString 全局常量 [重复]
【发布时间】:2012-08-09 14:29:10
【问题描述】:

可能重复:
Constants in Objective C

我在 NSUserDefaults 中存储了一些应用设置。 NSStrings 用作键。问题是我需要使用这些 NSString 键在整个应用程序中访问这些设置。在应用程序的某些部分访问时,我可能会错误地键入此类字符串键。

在整个应用程序中,我都有这样的陈述

[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"ReminderSwitch"];

BOOL shouldRemind = [[NSUserDefaults standardUserDefaults] boolForKey:@"ReminderSwitch"];

如何以及在哪里声明一个全局 NSString 常量,我可以在整个应用程序中访问它。然后我就可以使用该常量,而不必担心这些字符串键的输入错误。

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    首先,您应该选择真正的外部 C 符号——而不是宏。这样做是这样的:

    SomeFile.h

    extern NSString *const MONConstantString;
    

    SomeFile.m

    NSString *const MONConstantString = @"MONConstantString";
    

    请注意,如果您混合使用 ObjC 和 ObjC++,则需要为 C++ TU 指定 extern "C" ——这就是为什么您会看到 #defined 导出因语言而异。


    然后,您需要将常量放在与其相关的接口附近。以您的示例为指导,您可能需要一组接口或声明来满足您的应用偏好。在这种情况下,您可以将声明添加到 MONAppsPreferences 标头:

    MONAppsPreferences.h

    extern NSString *const MONApps_Pref_ReminderSwitch;
    

    MONAppsPreferences.m

    NSString *const MONApps_Pref_ReminderSwitch = @"MONApps_Pref_ReminderSwitch";
    

    使用中:

    #import "MONAppsPreferences.h"
    ...
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:MONApps_Pref_ReminderSwitch];
    

    【讨论】:

      【解决方案2】:

      我认为你的想法是对的。例如,我制作了如下的 Const.h/m 文件:

      Const.h

      extern NSString *const UserIdPrefKey;
      extern NSString *const PasswordPrefKey;
      extern NSString *const HomepagePrefKey;
      

      Const.m

      #import "AEConst.h"
      
      NSString *const UserIdPrefKey = @"UserIdPrefKey";
      NSString *const PasswordPrefKey = @"PasswordPrefKey";
      NSString *const HomepagePrefKey = @"UrlHomepagePrefKey";
      

      只有 Const.h 必须被导入。

      当你写代码时,Xcode 支持写键名,这样你就可以避免输入错误。

      【讨论】:

        【解决方案3】:

        您似乎正在寻找的只是一种在您的应用程序中定义字符串常量的方法。

        this questionthis answer 给它,我在下面引用了:

        你应该创建一个类似的头文件

        // Constants.h 
        FOUNDATION_EXPORT NSString *const MyFirstConstant;
        FOUNDATION_EXPORT NSString *const MySecondConstant;
        //etc.
        

        您可以将此文件包含在每个使用常量的文件中或项目的预编译头文件中。

        您可以在 .m 文件中定义这些常量,例如

        // Constants.m 
        NSString *const MyFirstConstant = @"FirstConstant";
        NSString *const MySecondConstant = @"SecondConstant"; 
        

        应将Constants.m 添加到您的应用程序/框架的目标中,以便将其链接到最终产品。

        使用字符串常量代替#define'd 常量的优势 是您可以使用指针比较测试是否相等 (stringInstance == MyFirstConstant) 比字符串快得多 比较([stringInstance isEqualToString:MyFirstConstant])(和 更容易阅读,IMO)。

        感谢巴里·沃克 :)

        【讨论】:

        • 他只想要应用程序中的常量(内部链接),所以我想知道您为什么建议他导出它们(外部链接)?
        【解决方案4】:

        最简单的方法是制作简单的 .h 文件,例如 Utils.h 并在其中编写以下代码:

        #define kUserDefaults @"ReminderSwitch"

        【讨论】:

        • 是的,不是那么安全,有一些其他目标 c 文件有机会覆盖它而不会引起注意:(
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        相关资源
        最近更新 更多