“ ส่ง 'const NSString *' ไปยังพารามิเตอร์ของคำเตือน 'NSString *' เพื่อยกเลิกตัวระบุ "


353

ฉันมีค่าคงที่ NSString ที่ฉันต้องการโทรหา:

[newString isEqualToString:CONSTANT_STRING];

มีรหัสผิดที่นี่หรือไม่

ฉันได้รับคำเตือนนี้:

ส่ง 'const NSString *' ไปยังพารามิเตอร์ประเภท 'NSString *' เพื่อยกเลิกตัวระบุ

จะประกาศสิ่งเหล่านี้ได้อย่างไร?


2
สตริงเหล่านี้มีวิธีการกำหนดอย่างไร

คำตอบ:


917

คุณควรประกาศสตริงคงที่ของคุณดังนี้

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
ฉันหวังว่าฉันจะให้ upvotes สิบคุณ! ขอบคุณสำหรับคำตอบที่เข้าใจได้และมีประโยชน์มาก!
Constantino Tsarouhas

1
NSString * const เป็น const pointer ของ NSString ได้อย่างไร? ตัวสร้างไวยากรณ์บริบทของพวกเขาคืออะไร
user4951

3
@Jim ปัญหาอยู่ในคุณไม่ได้เรียนรู้ C อย่างถูกต้องไม่โทษคนอื่น ตัวระบุconstใช้กับคำที่อยู่ทางซ้ายและนำไปใช้กับคำที่อยู่ทางด้านขวาเฉพาะเมื่อไม่มีสิ่งใดอยู่ทางด้านซ้ายของมัน (เช่นconst char *และchar const *ตัวชี้ที่ไม่ใช่ const เพื่อ const char แต่char *constเป็นตัวชี้ const สำหรับ char ไม่ใช่ )

8
+1 และ +1000 สำหรับ"นอกจากนี้วัตถุ NSString ยังไม่เปลี่ยนรูปดังนั้นการทำให้วัตถุเหล่านั้น const 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.