“ 'const NSString *'을 'NSString *'유형의 매개 변수로 보내면 한정자가 삭제됩니다. "경고


353

상수 NSString이 있는데 다음과 같이 호출하려고합니다.

[newString isEqualToString:CONSTANT_STRING];

여기에 잘못된 코드가 있습니까?

이 경고가 나타납니다.

'NSString *'유형의 매개 변수에 'const NSString *'을 전송하면 규정자가 삭제됩니다.

이것들은 어떻게 선언되어야합니까?


2
이 문자열은 어떻게 정의됩니까?

답변:


916

상수 문자열을 다음과 같이 선언해야합니다.

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

대신에:

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

전자는 NSString객체에 대한 상수 포인터 이고 후자는 객체에 대한 포인터 NSString입니다.

를 사용하면 NSString * constkSomeConstantString을 다시 지정하여 다른 NSString객체 를 가리킬 수 없습니다 .

이 메소드 isEqualToString:는 유형의 인수를 예상합니다 NSString *. 상수 문자열 ( const NSString *)에 포인터를 전달하면 예상 한 것과 다른 것을 전달하는 것입니다.

게다가, NSString객체는 이미 불변이므로 객체를 만드는 const NSString것은 의미가 없습니다.


3
전자는 NSString 객체에 대한 상수 포인터라고 말했다. 따라서 포인터가 일정하다는 것을 의미합니다. 따라서 다른 NSString에 다시 할당 할 수 없습니다.
user4951

8
나는 당신에게 10 개의 공감대를 줄 수 있기를 바랍니다! 이해하기 쉽고 도움이되는 답변에 감사드립니다!
Constantino Tsarouhas

1
어떻게 NSString * const가 NSString에 대한 const 포인터입니까? 문맥 자유 문법 생성기는 무엇입니까?
user4951

3
@Jim 문제는 C를 제대로 배우지 못했기 때문에 다른 사람들을 비난하지 마십시오. const규정은 왼쪽에있는 용어에 적용하고,이 예는 왼쪽 (에 아무것도 없습니다 만 오른쪽에있는 용어에 적용 const char *하고,이 char const *const를 숯불에 const가 아닌 포인터가 있지만 char *constconst가 아닌 숯불에 const를 포인터입니다 ).

8
+1. 그리고위한 1000 "게다가,이 NSString 객체가있는 NSString 의미가 CONST 그래서 그들을 만들기, 이미 불변입니다."
Madbreaks

6

스택 오버 플로우에서 다양한 게시물에있는 한곳에 모든 것을 배치하고 나를 위해 일하기 만하면 #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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.