Peringatan “mengirimkan 'const NSString *' ke parameter dari tipe 'NSString *' membuang kualifikasi”

353

Saya memiliki Constants NSString, yang ingin saya sebut seperti:

[newString isEqualToString:CONSTANT_STRING];

Ada kode yang salah di sini?

Saya mendapat peringatan ini:

mengirim 'const NSString *' ke parameter dari tipe 'NSString *' membuang kualifikasi

Bagaimana seharusnya ini dinyatakan?

pengguna4951
sumber
2
bagaimana string ini didefinisikan?

Jawaban:

917

Anda harus mendeklarasikan string konstan Anda sebagai berikut:

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

dari pada:

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

Yang pertama adalah pointer konstan ke NSStringobjek, sedangkan yang kedua adalah pointer ke NSStringobjek konstan .

Menggunakan NSString * constmencegah Anda menetapkan kembali kSomeConstantString untuk menunjuk ke NSStringobjek yang berbeda .

Metode ini isEqualToString:mengharapkan argumen tipe NSString *. Jika Anda meneruskan pointer ke string konstan ( const NSString *), Anda melewatkan sesuatu yang berbeda dari yang diharapkan.

Selain itu, NSStringobjek sudah berubah, sehingga membuatnya const NSStringtidak ada artinya.

albertamg
sumber
3
Anda mengatakan yang pertama adalah pointer konstan ke objek NSString. Jadi itu berarti pointernya konstan. Oleh karena itu saya tidak dapat menetapkan kembali untuk NSString lain
user4951
8
Saya berharap saya bisa memberi Anda sepuluh upvotes! Terima kasih atas jawaban Anda yang dapat dimengerti dan sangat membantu!
Constantino Tsarouhas
1
bagaimana di bumi NSString * const adalah pointer const ke NSString? Apa generator tata bahasa gratis konteksnya?
user4951
3
@ Jim masalahnya adalah di dalam kamu tidak belajar C dengan benar, jangan salahkan orang lain. The constkualifikasi berlaku untuk jangka di sebelah kiri, dan itu berlaku untuk jangka di sebelah kanan hanya jika tidak ada pada sisi kiri (misalnya const char *dan char const *pointer non-const untuk const char, tapi char *constadalah pointer const char non-const ).
8
+1. Dan +1000 untuk "Selain itu, objek NSString sudah tidak berubah, jadi menjadikannya const NSString tidak ada artinya."
Madbreak
6

hanya untuk meletakkan semua di satu tempat yang ditemukan di berbagai pos di stackoverflow dan berfungsi untuk saya, #define buruk karena Anda tidak dapat mengambil manfaat dari jenis variabel, pada dasarnya kompiler menggantikan semua kejadian ketika mengkompilasi (impor Constants.h kapan pun Anda membutuhkan):

//  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
pembekuan_
sumber