"发送 'const NSString *'到“NSString *”类型的参数丢弃限定符”警告

发布于 2024-11-26 12:21:54 字数 236 浏览 2 评论 0 原文

我有常量 NSString,我想这样调用:

[newString isEqualToString:CONSTANT_STRING];

这里有错误的代码吗?

我收到这个警告:

将“const NSString *”发送到“NSString *”类型的参数会丢弃限定符

这些应该如何声明?

I have Constants NSString, that I want to call like:

[newString isEqualToString:CONSTANT_STRING];

Any wrong code here?

I got this warning:

sending 'const NSString *' to parameter of type 'NSString *' discards qualifiers

How should these be declared?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

停滞 2024-12-03 12:21:54

您应该按如下方式声明常量字符串:

NSString * const kSomeConstantString = @""; // constant pointer

而不是:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

前者是指向 NSString 对象的常量指针,而后者是指向常量 NSString 对象的指针。

使用 NSString * const 可以防止您重新分配 kSomeConstantString 以指向不同的 NSString 对象。

方法 isEqualToString: 需要一个 NSString * 类型的参数。如果您传递一个指向常量字符串 (const NSString *) 的指针,则您传递的内容与预期不同。

此外,NSString 对象已经是不可变的,因此将它们设置为 const NSString 是没有意义的。

You should declare your constant string as follows:

NSString * const kSomeConstantString = @""; // constant pointer

instead of:

const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";

The former is a constant pointer to an NSString object, while the latter is a pointer to a constant NSString object.

Using a NSString * const prevents you from reassigning kSomeConstantString to point to a different NSString object.

The method isEqualToString: expects an argument of type NSString *. If you pass a pointer to a constant string (const NSString *), you are passing something different than it expects.

Besides, NSString objects are already immutable, so making them const NSString is meaningless.

掌心的温暖 2024-12-03 12:21:54

只是为了将所有内容放在一个地方,该位置在 stackoverflow 上的各种帖子上找到并且对我有用,#define 很糟糕,因为您无法从变量类型中受益,基本上编译器会在编译时替换所有出现的情况(每当需要时导入 Constants.h):

//  Constants.h
#import <Foundation/Foundation.h>

@interface Constants : NSObject

extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end

// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"

@implementation Constants

NSString *APP_STATE_LOGGED_IN  = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end

just to put all on one place which found on various post on stackoverflow and works for me , #define is bad because you cannot benefit from variable types, basically the compiler replaces all occurrence when compiles (import Constants.h whenever you need) :

//  Constants.h
#import <Foundation/Foundation.h>

@interface Constants : NSObject

extern NSString *APP_STATE_LOGGED_IN;
extern NSString *APP_STATE_LOGGED_OUT;
@end

// Constants.m
#import <Foundation/Foundation.h>
#import "Constants.h"

@implementation Constants

NSString *APP_STATE_LOGGED_IN  = @"APP_STATE_LOGGED_IN";
NSString *APP_STATE_LOGGED_OUT = @"APP_STATE_LOGGED_OUT";
@end
惜醉颜 2024-12-03 12:21:54

抽出几分钟时间阅读本文。关于指针的好读物对常量来说是地狱,反之亦然。

http://c-faq.com/decl/spiral.anderson.html

spare few minutes to read this. A goodread on pointers hell on constants and vice-versa.

http://c-faq.com/decl/spiral.anderson.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文