在哪里定义所有常量/全局变量?

时间:2013-03-09 09:05:26

标签: ios objective-c

我喜欢

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]];

KeychainItemWrapper *keychainItem = [[KeychainItemWrapper alloc] initWithIdentifier:@"xyz" accessGroup:nil];

我必须始终在所有文件中定义。有没有办法可以在一个文件中定义它们并且每次只导入它?

修改

所以我建议将其添加到我的app delegate

#import <UIKit/UIKit.h>
@class AFHTTPClient;
@class KeychainItemWrapper;

@interface TestAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong, readonly) AFHTTPClient *httpClient;
@property (nonatomic, strong, readonly) KeychainItemWrapper *keychainItem;
@end

然后尝试在我的viewcontroller中将我的httpClient定义为

httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]];

它给我一个错误use of undeclared identifier 'httpClient'

4 个答案:

答案 0 :(得分:0)

是的,您创建一个具有声明常量的文件并每次导入它:)

答案 1 :(得分:0)

有很多方法。您可以创建专用的头文件。您可以在AFHTTPClientKeychainItemWrapper上添加类别。

我可能只是在AppDelegate上的所有方法。您无需在AFHTTPClient.h中导入KeychainItemWrapper.hAppDelegate.h即可执行此操作。您可以直接声明类:

@class AFHTTPClient;
@class KeychainItemWrapper;

@interface AppDelegate : NSObject <UIApplicationDelegate>

@property (nonatomic, readonly) BOOL isIPhone5;
@property (nonatomic, strong, readonly) AFHTTPClient *httpClient;
@property (nonatomic, strong, readonly) KeychainItemWrapper *keychainItem;

...

然后,您只需在实际需要使用这些对象的文件中加入AFHTTPClient.hKeychainItemWrapper.h

BTW,与DBL_EPSILON的比较毫无意义。首先,在iOS上,CGFloatfloat的别名,而不是double。你不必要地转换为double。其次,屏幕的height为568.单精度float可以精确地表示-16777216和16777216之间的每个整数,包括568.您可以测试是否相等。

答案 2 :(得分:0)

我几年没有创建一个全局常量文件......对于这样的定义,总会有一个更好,更本地化的地方。尽管如此,这些功能仍然有用 - 会回答,但考虑一下如何将这些功能声明为更接近需要它们的实现。

  • 创建头文件和源文件
  • 声明C函数或具有类方法的ObjC类接口。
  • 定义功能/方法
  • 然后#import'全局常量'标题仅在需要时(不在PCH中)

使用C函数的示例:

// MONApp_Constants.h
// no #imports up here

extern bool MONApp_Is_iPhone5(void);

@class AFHTTPClient;
extern AFHTTPClient * MONApp_HTTPClient(void);

@class KeychainItemWrapper;
extern KeychainItemWrapper * MONApp_KeychainItem(void);

当然,如果只需要一个实例,则需要找到一个控制对象引用的好地方。在这种情况下,函数不应全局可见。

答案 3 :(得分:0)

您需要在名为constants.h的文件中声明全局变量,并在必要的其他文件中导入。

我建议你不要这样做:

#define httpClient [[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"https://www.test.com/"]]];

您尝试请求的URL的原因可能有所不同。 #define的想法是拥有不变的项目。即使您总是从@“https://www.test.com/”请求,我仍然不建议您这样做。

希望这会有所帮助......