Mam stałe NSString, które chcę nazwać:
[newString isEqualToString:CONSTANT_STRING];
Masz tutaj zły kod?
Dostałem to ostrzeżenie:
wysyłanie „const NSString *” do parametru typu „NSString *” odrzuca kwalifikatory
Jak należy je zadeklarować?
Mam stałe NSString, które chcę nazwać:
[newString isEqualToString:CONSTANT_STRING];
Masz tutaj zły kod?
Dostałem to ostrzeżenie:
wysyłanie „const NSString *” do parametru typu „NSString *” odrzuca kwalifikatory
Jak należy je zadeklarować?
Odpowiedzi:
Powinieneś zadeklarować swój stały ciąg w następujący sposób:
NSString * const kSomeConstantString = @""; // constant pointer
zamiast:
const NSString * kSomeConstantString = @""; // pointer to constant
// equivalent to
NSString const * kSomeConstantString = @"";
Pierwszy z nich jest stałym wskaźnikiem do NSStringobiektu, podczas gdy drugi jest wskaźnikiem do stałego NSStringobiektu.
Użycie a NSString * constuniemożliwia ponowne przypisanie kSomeConstantString w celu wskazania innego NSStringobiektu.
Metoda isEqualToString:oczekuje argumentu typu NSString *. Jeśli przekażesz wskaźnik do stałego łańcucha ( const NSString *), przekażesz coś innego niż się spodziewa.
Poza tym NSStringobiekty są już niezmienne, więc ich tworzenie const NSStringjest bez znaczenia.
constKwalifikator dotyczy terminu na jego lewej stronie, a to odnosi się do terminu na jej prawa tylko wtedy, gdy nie ma nic na jej lewej stronie (np const char *i char const *są non-const wskaźniki do const char, ale char *constjest wskaźnikiem const do const char ).
po prostu umieszczam wszystko w jednym miejscu, które można znaleźć w różnych postach na przepełnieniu stosu i działa dla mnie, #define jest złe, ponieważ nie możesz korzystać z typów zmiennych, w zasadzie kompilator zastępuje wszystkie wystąpienia podczas kompilacji (importuj Constants.h, kiedy potrzebujesz):
// 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
poświęć kilka minut, aby to przeczytać. Dobra lektura na temat wskaźników piekła na stałych i odwrotnie.