使用目标c中的值存储任何类型的常量

时间:2013-12-05 17:01:59

标签: ios objective-c constants

我是目标c的新手,我来自.NET背景。我想创建一个静态类,它将存储任何类型的常量(NSString,NSArray等)。在.NET中,我将创建一个类并使用“public const”声明const。我如何在目标C中做同样的事情?我看看创建一个类是NSObject的子类,但我不确定,我不想使用#define。任何帮助将不胜感激

样品:

public class ApplicationConstants()
{
   public const string globalString="This is a global string";
   public const int sample=1;
}

我想在目标c中做这样的事情。任何示例代码的链接都非常有用。我也想以相同的方式存储数组

5 个答案:

答案 0 :(得分:3)

Objective-C没有类变量。有两种方法可以实现相同的功能:

  1. 使用全局变量,其名称指示它们属于哪个类。 E.G。
  2. 部首:

    extern NSString *const BCOpinionatedClassWillStartOpiningNotification;
    

    实现:

    NSString *const BCOpinionatedClassWillStartOpiningNotification = @"BCOpinionatedClassWillStartOpiningNotification";
    

    2创建一个返回值的类方法。 E.G:

    部首:

    @interface BCOpinionatedClass
    +(NSInteger)theBestIntegerEver;
    @end
    

    实现:

    @implementation OpinionatedClass
    +(NSInteger)theBestIntegerEver
    {
        return 1;
    }
    @end
    

答案 1 :(得分:3)

你不应该创建这个对象(你真的不应该在C#中创建这个对象,但我们现在正在讨论ObjC)。对于一个“程序的所有常量”的类,没有面向对象的意义。放置这些值的正确位置在需要它们的类中。因此,例如,如果为NSNotification名称创建字符串常量,则应将其定义放在发布该通知的类中。

通常,您根本不会将这些常量放在类中。您使用前缀命名来指示它们的相关内容。例如,UIApplicationDidBecomeActiveNotification字符串常量在UIApplication.h头文件中定义,因此:

UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification;

UIKIT_EXTERN是一个可移植性宏,只能解析为extern。在.m的内部,你会有一些像:

NSString *const UIApplicationDidBecomeActiveNotification = @"UIApplicationDidBecomeActiveNotification";

虽然此常量位于UIApplication.h内,但它不在UIApplication类或任何类中。 Objective-C没有提供你在C#中习惯的那种范围。我们使用命名前缀而不是命名空间。

同样的规则适用于其他类型;这不仅仅是为了字符串。例如,再次来自UIApplication.h

typedef NS_ENUM(NSInteger, UIApplicationState) {
  UIApplicationStateActive,
  UIApplicationStateInactive,
  UIApplicationStateBackground
} NS_ENUM_AVAILABLE_IOS(4_0);

这里我们定义一个枚举,间接定义各种整数值。同样,这只是在头文件中。 UIApplication内没有封装。我们只知道它是UIApplication的一部分,因为它的前缀。

即使那些在整个系统中无处不在的东西,例如UIKitDefines.hAvailability.h,仍然会被分解成它们自己包含的标题。没有“这里是所有UIKit对象的所有定义”文件。你不应该为你的程序创建一个。

请注意,全局变量的使用仅适用于常量。你不应该以这种方式对可变变量使用全局变量。它们应属于某个类并具有访问器。但同样,他们将属于使用它们的类,而不是“通用程序东西”类。

另见@Benedict Cohen关于如何将这些东西作为类方法实现的答案,它具有一些好处(例如,它允许子类化)。它也不太方便,也不是最常用的方法。

答案 2 :(得分:0)

看看this answer。例如,您可以在标题中定义字符串常量,如:

FOUNDATION_EXPORT NSString *const aConstantString;

然后在实现文件中初始化它们:

NSString *const aConstantString = @"Some constant string";

如果您想知道FOUNDATION_EXPORT是什么,请NSObjCRuntime.h #defineextern

答案 3 :(得分:0)

我认为你对改变编码域感到困惑。

在.NET中,

public const string globalString="This is a global string";

定义一个不可变的常量字符串,这意味着,您无法更改globalString指向的内存位置的内容。您可以在类级别定义此类变量。

另一方面,Objective-C是纯C的继承者,并不是完全面向对象的。相反,它支持在模块级别声明不可变变量。这意味着,您可以在标头中定义一个不可变变量,并且可以从导入该标头的任何模块访问该变量。

因此,您可以在模块级别声明常量变量,例如,在标题顶部,如

extern const NSString* const globalString;

然后你需要在你的实现(.m)文件的顶部初始化它,如

const NSString* const globalString = @"This is a global string";

这里,const NSstring* const表示变量globalString指向唯一的内存位置(尾随const),它包含一些不可变的值(@"这是一个全局字符串& #34;)无法更改(领先const)。所以它变得等同于你的.NET声明。

此处需要记住的另一件事NSStringNSArrayNSDictionary等本质上是不可变的(NSMutableStringNSMutableArray,{{1它们作为可变对应物)并且您不需要为它们指定前导NSMutableDictionary关键字,因为它是隐式定义的。所以可以写:

const

用于声明常量字符串。

希望有助于理解。

答案 4 :(得分:0)

使用带有NSArray的singleton来保存数据。 要添加的对象可以初始化并添加到您的singleton init上的NSArray中,并可以使用。 或者甚至更好,使用NSMutableDictionary,您可以使用键存储和检索对象。

单身人士模式: Singleton with ARC

的NSDictionary: https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/classes/nsdictionary_class/Reference/Reference.html