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 NSString
obiektu, podczas gdy drugi jest wskaźnikiem do stałego NSString
obiektu.
Użycie a NSString * const
uniemożliwia ponowne przypisanie kSomeConstantString w celu wskazania innego NSString
obiektu.
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 NSString
obiekty są już niezmienne, więc ich tworzenie const NSString
jest bez znaczenia.
const
Kwalifikator 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 *const
jest 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.