“'NSString *' türündeki parametreye 'const NSString *' göndermek niteleyicileri atar” uyarısı


353

Ben gibi aramak istiyorum Sabitler NSString var:

[newString isEqualToString:CONSTANT_STRING];

Burada yanlış kod var mı?

Bu uyarıyı aldım:

'NSString *' türündeki parametreye 'const NSString *' gönderilmesi niteleyicileri atar

Bunlar nasıl beyan edilmelidir?


2
bu dizeler nasıl tanımlanır?

Yanıtlar:


917

Sabit dizenizi aşağıdaki gibi bildirmelisiniz:

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

onun yerine:

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

Birincisi bir NSStringnesnenin sabit bir göstergesidir , ikincisi ise sabit bir NSStringnesnenin göstergesidir.

A kullanmak, NSString * constkSomeConstantString öğesini farklı bir NSStringnesneyi işaret edecek şekilde yeniden atamanızı önler .

Yöntem isEqualToString:tür argümanını bekliyor NSString *. Bir işaretçiyi sabit bir dizeye ( const NSString *) iletirseniz, beklediğinden farklı bir şey iletiyorsunuzdur.

Ayrıca, NSStringnesneler zaten değişmezdir, bu yüzden onları const NSStringyapmak anlamsızdır.


3
Birincisinin bir NSString nesnesinin sabit işaretçisi olduğunu söylediniz. Bu, işaretçinin sabit olduğu anlamına gelir. Bu yüzden bunu başka bir NSString'e atayamam.
user4951

8
Keşke sana on oy verebilseydim! Anlaşılabilir ve çok yardımcı cevabınız için teşekkür ederiz!
Constantino Tsarouhas

1
nasıl toprak NSString * const NSString için bir const işaretçi nedir? Bağlamdan bağımsız gramer oluşturucuları nedir?
user4951

3
@Jim problemi, C'yi düzgün bir şekilde öğrenmediniz, başkalarını suçlamayın. constEleme onun soldaki sürelerini belirten ve orada mesela sol tarafında (üzerinde hiçbir şey yalnızca onun sağdaki sürelerini belirten const char *ve bir char const *const char const olmayan noktalar şunlardır fakat char *constolmayan const char const işaretçisi ).

8
+1. Ve +1000 "Ayrıca, NSString nesneleri zaten değişmezdir, bu yüzden onları NSString'i sabitlemek anlamsızdır."
Madbreaks

6

stackoverflow üzerinde çeşitli yazılarda bulunan ve benim için çalışan bir yere koymak için, #define kötü çünkü değişken türlerden yararlanamazsınız, temel olarak derleyici derlendiğinde tüm oluşumun yerini alır (ihtiyacınız olduğunda Constants.h dosyasını içe aktarın):

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.