Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 目标C宏附加到字符串_Ios_Objective C - Fatal编程技术网

Ios 目标C宏附加到字符串

Ios 目标C宏附加到字符串,ios,objective-c,Ios,Objective C,我认为这是一件非常简单的事情,但由于我对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“ stackoverf

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

删除尾随分号:

#define RESTFUL_PATH_PREFIX @"https://gogch.com/gch-restful";
                                                            ^
然后,编译器可以连接字符串常量:

@"first" @"second"
而不是:

@"first"; @"second"

删除尾随分号:

#define RESTFUL_PATH_PREFIX @"https://gogch.com/gch-restful";
                                                            ^
然后,编译器可以连接字符串常量:

@"first" @"second"
而不是:

@"first"; @"second"

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

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

然后可以使用
nsstringwithformat:
方法连接字符串。

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

static NSString *const YourPath = @"https://...";
然后,您可以将字符串与
NSString stringWithFormat:
方法连接起来。

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


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

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

您可以做什么:
  • 创建一个新的.m/.c文件,在Xcode中使用头
  • 在.m/.c文件中,声明并初始化常量
  • 根据需要导出常量,以便其他编译单元可以访问它

  • 常数.h
    main.m
    #导入
    #导入“constants.h”
    int main(int argc,const char*argv[]{
    @自动释放池{
    NSLog(@“常量值:%@”,devBaseUrl);
    //打印:常量值:http://127.0.0.1:8000/
    }
    返回0;
    }
    
    既然我对一个标记为重复的问题做出了回答,我也将在这里回答它


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

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

    您可以做什么:
  • 创建一个新的.m/.c文件,在Xcode中使用头
  • 在.m/.c文件中,声明并初始化常量
  • 根据需要导出常量,以便其他编译单元可以访问它

  • 常数.h
    main.m
    #导入
    #导入“constants.h”
    int main(int argc,const char*argv[]{
    @自动释放池{
    NSLog(@“常量值:%@”,devBaseUrl);
    //打印:常量值:http://127.0.0.1:8000/
    }
    返回0;
    }
    
    @dropy您可以从类型安全中获益。这不是真的;编译器将很快告诉您是否尝试连接字符串和非字符串类型。@Droppy您是对的。这就解释了为什么它更好,并不是说每一句话都“更好”,而是更具声明性。值得一提的是,我使用了两种范式的框架。经验法则:做框架做的事情。如果你正在创建一个新的框架,选择一个范例并坚持下去。您将获得更多带有常量的调试功能。。。这就是我所能想到的。@Droppy你可以从类型安全中获益。那不是真的;编译器将很快告诉您是否尝试连接字符串和非字符串类型。@Droppy您是对的。这就解释了为什么它更好,并不是说每一句话都“更好”,而是更具声明性。值得一提的是,我使用了两种范式的框架。经验法则:做框架做的事情。如果你正在创建一个新的框架,选择一个范例并坚持下去。您将获得更多带有常量的调试功能。。。这就是我所能想到的。