Objective C宏附加到字符串

时间:2015-06-05 10:27:46

标签: ios objective-c

我认为这是一件非常简单的事情,但由于我是iOS开发和目标C的新手,我无法理解。

#define RESTFUL_PATH_PREFIX @"https://gogch.com/gch-restful";
#define LOGIN RESTFUL_PATH_PREFIX @"/login;

我想要结果"https://gogch.com/gch-restful/login"

但我的结果为"https://gogch.com/gch-restful"

stackoverflow中的其他主题仅提及将新字符串添加到字符串的开头,如

#define DOMAIN "example.com"
#define SUBDOMAIN "test." DOMAIN

3 个答案:

答案 0 :(得分:3)

删除尾部分号:

#define RESTFUL_PATH_PREFIX @"https://gogch.com/gch-restful";
                                                            ^

然后字符串常量可以由编译器连接:

@"first" @"second"

而不是:

@"first"; @"second"

答案 1 :(得分:2)

使用常量而不是定义宏是更好的做法。

static NSString *const YourPath = @"https://...";

然后,您可以使用NSString stringWithFormat:方法连接字符串。

答案 2 :(得分:0)

由于我对标记为欺骗的问题做出了回答,我也会在这里回答

当然,您可以使用定义OR,您可以使用NSString常量。这确实是一个偏好的问题......但是我看到之前使用的是#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;
    }