【问题标题】:correct way of declaring string constants that depend on #defines in objective c声明依赖于目标c中#defines的字符串常量的正确方法
【发布时间】:2011-02-07 12:30:11
【问题描述】:

我需要声明一堆不变的 URL,但可能会因构建配置而异。

我现在拥有的是:

  • .h 文件声明如下内容:

    外部 NSString * const MY_URL;

  • 对应的.m文件有:

    NSString * const MY_URL = @"http://myhost/myfolder";

我希望能够根据构建标志更改“myhost”。我的尝试是创建一个定义,例如:

#ifdef MYFLAG
#   define HOST @"http://myhost"
#else
#   define HOST @"http://myotherhost"
#endif

然后通过将 HOST 附加到字符串的其余部分来创建常量:

NSString * const MY_URL = [HOST stringByAppendingString:@"/myfolder"];

但显然“Initializer element is not constant”

所以我的问题是:

我的方法正确吗?如果是这样,你能告诉我正确的做法吗? 也许这不是目标c中应该做的这种事情的方式?

非常感谢您的宝贵时间!

【问题讨论】:

    标签: objective-c string constants definition


    【解决方案1】:

    看看这个Stack Overflow answer

    你不能用另一个变量的结果来初始化一个常量,即使那个结果是一个常量。

    做你想做的事情的一种方法是将定义包装在标志中:

    #ifdef MYFLAG
    #   NSString * const MY_URL = @"http://myhost/myfolder";
    #else
    #   NSString * const MY_URL = @"http://myotherhost/myfolder";
    #endif
    

    编辑 - 疯狂的想法!

    好的,所以您不想手动配置一堆 url。这是一个疯狂的想法:创建一个提供所需 URL 的类怎么样?这样,您可以将它们设置在一个地方,并且您只需在一个地方将它们翻译成 url。例如

    //HostURLs.h
    #import <Cocoa/Cocoa.h>
    
    @interface HostURLs : NSObject {
    @private
        NSString *baseURLString;
        NSString *myURLString1;
        NSString *myURLString2;
    }
    @property (nonatomic, readonly) NSURL *myURL1;
    @property (nonatomic, readonly) NSURL *myURL2;
    
    @end
    

    然后就可以声明类了

    //HostURLs.m
    
    #import "hostURLs.h"
    
    @implementation HostURLs
    
    - (id)init  {
        // You might want to set this up as as Singleton.   
        if (!(self = [super init])) {
            return nil; // Bail!
        }
        #ifdef MYFLAG
            baseURLString = @"http://myhost/";
        #else
            baseURLString = @"http://myotherhost/";
        #endif
    
        myURLString1 = @"myURL1";
        myURLString2 = @"myURL2";
    
        return self;
    }
    
    - (NSURL *)myURL1 {
        NSString *urlString = [baseURLString stringByAppendingString:myURLString1];
        return [NSURL urlWithString:urlString];
    }
    
    - (NSURL *)myURL2 {
        NSString *urlString = [baseURLString stringByAppendingString:myURLString2];
        return [NSURL urlWithString:urlString];
    }
    
    @end
    

    是的,这太疯狂了。但这样一来,您就可以在一个地方控制所有网址。

    【讨论】:

    • 谢谢,我确实阅读了那个答案。我需要使用 20 多个 url 来做到这一点,这就是我不喜欢这个选项的原因。感谢您的回答:)
    • 嘿,“疯狂的想法”看起来对我更有吸引力。感谢您投入时间帮助我!
    • 在这种情况下,点赞不会有什么坏处。而且,您可以accept 回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多