用可变常量替换字符串

时间:2016-09-22 15:28:29

标签: objective-c

在我的项目中,我定义了这样的网址:

font-size

由于根网址(p)始终相同,有没有办法将其设置为常量,然后对其余部分使用字符串替换?

例如,在其他文件中,我可以这样做:

#define TERMSURL       @"http://127.0.0.1:8000/terms/"
#define PRIVACYURL     @"http://127.0.0.1:8000/privacy/"
...

对于我目前的做法,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:0)

shared.h

#define TERMSURL       @"http://127.0.0.1:8000/terms/"
#define PRIVACYURL     @"http://127.0.0.1:8000/privacy/"
#define URL_BASE       @"http://127.0.0.1:8000/"

yourClass.m

NSString * stringUrlBase = URL_BASE;
NSString *url1 = [NSString stringWithFormat:@"%@terms/", stringUrlBase];

答案 1 :(得分:0)

当然,你可以做到。不过,我之前看过#defineNSString const * const。定义更容易,并且您可能不会通过在整个地方使用常量而不是NSString的单个不可变实例来保存那么多内存。

一些建议是考虑如何导出NSString常量。您可能需要EXTERN_PRIVATE而不是EXTERN,但我的示例代码将允许您标头的所有客户端读取您在其中声明的字符串常量。

你能做什么:

  1. 使用Xcode中的标题创建一个新的.m / .c文件
  2. 在.m / .c文件中,声明并初始化常量
  3. 根据需要导出常量,以便其他编译单元可以访问它
  4. constants.h

    #ifndef constants_h
    #define constants_h
    
    // Export the symbol to clients of the static object (library)
    #define EXTERN extern __attribute__((visibility("default")))
    // Export the symbol, but make it available only within the static object
    #define EXTERN_PRIVATE extern __attribute__((visibility("hidden")))
    // Make the class symbol available to clients
    #define EXTERN_CLASS __attribute__((visibility("default")))
    // Hide the class symbol from clients
    #define EXTERN_CLASS_PRIVATE __attribute__((visibility("hidden")))
    #define INLINE static inline
    
    #import <Foundation/Foundation.h>
    
    EXTERN NSString const * _Nonnull const devBaseUrl;
    
    #endif /* constants_h */
    

    constants.m

    #include "constants.h"
    
    NSString const * _Nonnull const devBaseUrl = @"http://127.0.0.1:8000/";
    

    的main.m

    #import <Foundation/Foundation.h>
    #import "constants.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            NSLog(@"Constant value: %@", devBaseUrl);
            // Prints: Constant value: http://127.0.0.1:8000/
        }
        return 0;
    }