【问题标题】:What is the standard for sharing constant defined variables共享常量定义变量的标准是什么
【发布时间】:2013-02-22 23:42:27
【问题描述】:

正如标题所说 - 在 Java 中,我只需让一个类定义常量,然后将它们导入到将使用它们的类中。在 Objective-C 中是不是也是这样?

为了清楚起见,我想

#define variable 1
#define variable 2.0

并且在不同的类中使用相同的常量。

【问题讨论】:

  • 术语提示:当它们是#defined 常量时,它们不是“变量”。 :) 与 Java 不同,当您在 C 中 #define 时,您正在执行实际的文本替换;它不像一个碰巧不会改变的变量(出于某些目的,C 中确实存在 const 全局变量)。
  • @BenZotto 如果用术语:它们被称为宏,而不是常量。

标签: objective-c static constants


【解决方案1】:

将宏放在头文件中,并在需要访问它们时将#include#import 放在该头文件中。

【讨论】:

    【解决方案2】:

    还有另一种使用宏的替代方法。您可以将它们定义为全局变量。

    在常量.h中:

    extern int variableX;
    extern float variableY;
    

    在 Constants.m 中(通常在导入之后,在任何其他代码之前):

    int variableX = 1;
    float variableY = 2.0f;
    

    与宏相比,这种方法有几个优点:

    1. 客户不需要看到价值。
    2. 如果值发生变化,则无需重新编译每个导入 Constants.h 的文件。
    3. 可以通过多种不同方式初始化值,而不仅仅是使用文字。
    4. 使用变量时的类型安全和编译器检查。

    【讨论】:

      【解决方案3】:

      您的示例正在使用 C 预处理器宏。这在 Objective-C 中的工作方式与在任何其他支持 C 样式预处理器宏的环境中相同:将它们粘贴到共享标头和 #import#include 中。

      虽然没关系,但您询问的是与类相关的常量,尤其是 Objective-C。在 Objective-C 中,您经常会看到常量 NSStrings(例如,用于通知名称或字典键)和属于这样定义的特定类的类似常量:

      在标题(.h)中:

      extern NSString * const LibraryEntryDidUpdateNotification;
      extern const NSUInteger LibraryEntryDefaultStarRating;
      
      @interface LibraryEntry : NSObject
      
      ...
      

      在实现中(.m):

      NSString * const LibraryEntryDidUpdateNotification = @"LibraryEntryDidUpdateNotification";
      const NSUInteger LibraryEntryDefaultStarRating = 3;
      
      @implementation LibraryEntry
      
      ...
      

      这就是 Apple 在其现代框架中的做法,以及许多第 3 方开发人员的做法。在我看来,重构比预处理宏更容易(例如,当使用 Xcode 中的“重构”按钮重命名类时,同样可以轻松处理这些常量),但常量的预处理宏也有其好处。

      如果您有兴趣,请参阅 herehere 以更深入地讨论该主题。

      【讨论】:

      • 第二篇参考文章帮助我确定#define 是我的应用程序要走的路。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 2018-11-05
      • 2015-01-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-14
      相关资源
      最近更新 更多