我是目标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中做这样的事情。任何示例代码的链接都非常有用。我也想以相同的方式存储数组
答案 0 :(得分:3)
Objective-C没有类变量。有两种方法可以实现相同的功能:
部首:
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.h
和Availability.h
,仍然会被分解成它们自己包含的标题。没有“这里是所有UIKit对象的所有定义”文件。你不应该为你的程序创建一个。
请注意,全局变量的使用仅适用于常量。你不应该以这种方式对可变变量使用全局变量。它们应属于某个类并具有访问器。但同样,他们将属于使用它们的类,而不是“通用程序东西”类。
另见@Benedict Cohen关于如何将这些东西作为类方法实现的答案,它具有一些好处(例如,它允许子类化)。它也不太方便,也不是最常用的方法。
答案 2 :(得分:0)
看看this answer。例如,您可以在标题中定义字符串常量,如:
FOUNDATION_EXPORT NSString *const aConstantString;
然后在实现文件中初始化它们:
NSString *const aConstantString = @"Some constant string";
如果您想知道FOUNDATION_EXPORT
是什么,请NSObjCRuntime.h
#define
为extern
。
答案 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声明。
此处需要记住的另一件事NSString
,NSArray
,NSDictionary
等本质上是不可变的(NSMutableString
,NSMutableArray
,{{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