【问题标题】:Objective C Macro append to stringObjective C 宏追加到字符串
【发布时间】:2015-08-20 06:28:44
【问题描述】:

我认为这是一件非常简单的事情,但由于我是 iOS 开发和 Objective 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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    既然我对一个被标记为欺骗的问题做了这个回答,我也将在这里回答它


    当然,你可以使用定义或者你可以使用 NSString 常量。这真的是一个偏好问题......然而,我之前看到过#defineNSString const * const 都被使用过。定义更容易,而且您可能不会通过使用常量而不是到处使用 NSString 的单个不可变实例来节省那么多内存。

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

    你可以做什么:

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

    常量.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 */
    

    常量.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;
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • @Droppy 你可以从类型安全中受益。
      • 这不是真的;如果您尝试连接字符串和非字符串类型,编译器会很快告诉您。
      • @Droppy 你是对的。这个answer 解释了为什么它更好。
      • 并不是说它“更好”,而是更具声明性。对于它的价值,我已经使用了利用这两种范式的框架。经验法则:做框架做的事情。如果您正在创建一个新框架,请选择一个范例并坚持下去。您将获得更多带有常量的调试功能......这就是我能想到的。
      【解决方案3】:

      去掉结尾的分号:

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

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

      @"first" @"second"
      

      代替:

      @"first"; @"second"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        相关资源
        最近更新 更多