#define or const string*



我知道这个问题已经被问过很多次了,但我的有点不同。在关闭本副本之前,请仔细阅读。有很多关于堆栈溢出的帖子说,"就我个人而言,我讨厌宏,不要用那个垃圾"。这些我都读过了,但我的情况不同。我试图定义在一个软件(iOS应用程序)使用的url使用#define宏。

我同意使用const字符串是比#define宏更好的实践。但是,在一个日益基于REST的API世界中,接受查询参数作为URL的一部分,您如何仍然使用const字符串来表示更改的URL ?

而不是http://api.myblog.com/posts?entryid=%@遵循REST原则的API服务器http://api.blog.com/posts/entries/[entryid]

在前一种类型中,所有条目的URL都是http://api.myblog.com/posts,它们不会改变。可以使用const字符串

在后一种类型中,URL随每个条目而变化,并且我使用了一个宏,它扩展为如下所示的完整URL。

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__];

我的方法是否存在设计缺陷?我想知道你的意见。

谢谢。

从编译器的角度来看,#define是一个预处理器指令(参考c中的定义,http://en.wikipedia.org/wiki/C_preprocessor)。

在这种情况下,编译器可能会在编译代码之前进行整个文本替换。

。:

#define GET_ENTRY_URL(__MY_ENTRY_ID__) [NSString stringWithFormat:@"http://api.myblog.com/posts/entries/%@", __MY_ENTRY_ID__];

可以将GET_ENTRY_URL(x)替换为[NSString…]在你的代码中。如果objective-c的实现遵循这一点,那么我们可能会在使用宏的任何地方创建实例。

static const/variable似乎是一个更好的方法。

我在我的应用程序中所做的是为基本路径和每个特定路径定义一个const,必要时在路径中使用替换格式代码。

NSString const *APIBasePath        = @"http://api.mydomain.com";
NSString const *APIEntryPath       = @"/entries/%d";
NSString const *APIUpdateEntryPath = @"/entries/%d/update";

然后在运行时为每个API构造URL,如下所示:

- (void)updateEntryNumber:(NSUInteger)entryNumber
{
  NSString *updateEntryPath = [NSString stringWithFormat:APIUpdateEntryPath, entryNumber];
  NSString *APIPath = [APIBasePath stringByAppendingPathComponent:updateEntryPath];
  // do something
}

相关内容

最新更新