2013-03-09 42 views
0

我有这样哪里定义我所有的常量/全局变量?

#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]; 

的事情,我在我所有的文件,所有的时间来定义。有没有一种方法可以在一个文件中定义它们,并且每次只导入它?

编辑

因此,作为建议我加入这个到我的应用程序委托

#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'

+1

也看看YourApp-Prefix.pch,这是所有的源文件 – Thorsten 2013-03-09 09:30:50

+0

@Thorsten头可以请您详细阐述多一点?这将如何工作? – Jonathan 2013-03-09 09:37:56

+0

你想在所有文件中都有相同的'httpClient'实例,或者每个文件都有一个新的不同实例吗? – Hejazi 2013-03-09 09:42:10

回答

0

有很多方法。你可以创建一个专用的头文件。您可以将类别放在AFHTTPClientKeychainItemWrapper之间。

我可能会到那些方法在我AppDelegate的只是所有。您不必在AppDelegate.h中输入AFHTTPClient.hKeychainItemWrapper.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

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

+0

是的,我有点想通:)我宁愿去自动布局。感谢您的建议,但。我应该在哪里把他们全部放在我的AppDelegate中?我不必在委托中导入与这些文件相关的所有标题? – Jonathan 2013-03-09 09:21:50

+0

我已经更新了我的答案。 – 2013-03-09 09:24:33

+0

也许我仍然在做错事,但它仍然给我错误 – Jonathan 2013-03-09 09:31:24

0

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

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); 

中当然,如果你只需要一个实例,你将需要找到一个适合对象的引用的好地方。在这种情况下,这些功能不应该是全局可见的。

0

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

我建议你不要这样做:

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

的原因,你想要求可以改变为URL。 #define的想法是对于不变的项目。即使你总是要求@“https://www.test.com/”,我仍然不会推荐你这样做。

希望这有助于...