Попередження "відправлення" const NSString * "до параметра типу" NSString * "відкидає кваліфікатори"


353

У мене є константи NSString, які я хочу називати так:

[newString isEqualToString:CONSTANT_STRING];

Тут невірний код?

Я отримав це попередження:

відправлення 'const NSString *' до параметра типу 'NSString *' відкидає кваліфікатори

Як вони повинні бути оголошені?


2
як визначаються ці рядки?

Відповіді:


916

Ви повинні оголосити свою постійну рядок наступним чином:

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безглуздо.


3
Ви сказали, що колишній - це постійний вказівник на об'єкт NSString. Це означає, що вказівник є постійним. Отже, я не можу перепризначити це іншому NSString.
user4951

8
Я б хотів, щоб я міг тобі дати десять грошей! Дякую за вашу зрозумілу і дуже корисну відповідь!
Константино Царухас

1
як у землі NSString * const - це const вказівник на NSString? Який у них контекстний генератор граматики?
user4951

3
@Jim проблема в тому, що ви не навчилися належним чином C, не звинувачуйте це в інших. constКласифікатор відноситься до терміну на його зліва, і це відноситься до терміну на його права , тільки якщо немає нічого на лівій бік (наприклад , const char *і char const *є неконстантнимі покажчиками на константний напівкокс, але char *constпокажчик сопзЬ до неконстантному напівкоксу ).

8
+1. І +1000 за "Окрім того, об'єкти NSString вже незмінні, тому робити їх констатувати NSString безглуздо."
Madbreaks

6

просто помістити все на одне місце, яке знайдено в різних публікаціях в 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

5

запасіть кілька хвилин, щоб прочитати це. Гаразд про покажчики пекла на константи і навпаки.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.