คำถามแรกคือขอบเขตที่คุณต้องการให้ค่าคงที่ของคุณมีอยู่ซึ่งเป็นสองคำถาม:
- ค่าคงที่เหล่านี้เป็นค่าเฉพาะสำหรับชั้นเรียนเดียวหรือไม่หรือมีเหตุผลที่จะให้พวกมันมีอยู่ทั่วแอปพลิเคชัน?
- หากพวกเขาเป็นคลาสเฉพาะพวกเขาจะใช้สำหรับลูกค้าของชั้นเรียนหรือเฉพาะภายในชั้นเรียน?
หากพวกเขาเฉพาะและภายในชั้นเดียวประกาศพวกเขาเป็นstatic const
ที่ด้านบนของไฟล์. m เช่น:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
หากพวกเขาเกี่ยวข้องกับชั้นเดียว แต่ควรเป็นสาธารณะ / ใช้โดยชั้นเรียนอื่น ๆ ประกาศพวกเขาเช่นเดียวกับextern
ในส่วนหัวและกำหนดไว้ใน. m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
หากพวกเขาควรจะเป็นระดับโลกประกาศพวกเขาในส่วนหัวและกำหนดพวกเขาในโมดูลที่เกี่ยวข้องโดยเฉพาะสำหรับค่าคงที่เหล่านั้น
คุณสามารถผสมและจับคู่สิ่งเหล่านี้กับค่าคงที่ต่างกันด้วยระดับที่แตกต่างกันของระดับโลกที่คุณต้องการให้เป็นและสำหรับค่าคงที่ระดับโลกที่แตกต่างกันซึ่งไม่ได้อยู่ด้วยกัน - คุณสามารถใส่พวกมันไว้ในโมดูลแยกต่างหาก ต้องการ.
ทำไม#define
ล่ะ
คำตอบเก่าคือ“ มาโครไม่มีข้อมูลประเภท” แต่คอมไพเลอร์ในวันนี้ค่อนข้างฉลาดในการทำการตรวจสอบตัวอักษรทุกชนิด (มาโครตัวใดขยาย) และตัวแปร
คำตอบที่ทันสมัยเป็นเพราะดีบักเกอร์ไม่รู้จักมาโครของคุณ คุณไม่สามารถพูด[myThing addObserver:self forKey:MyThingNotificationKey]
ในคำสั่งดีบักเกอร์ได้ถ้าMyThingNotificationKey
เป็นมาโคร โปรแกรมดีบั๊กสามารถรู้ได้ถ้ามันเป็นตัวแปร
ทำไมenum
ล่ะ
rmaddy เอาชนะฉันได้ในความคิดเห็น: enum
สามารถกำหนดค่าคงที่จำนวนเต็มเท่านั้น สิ่งต่าง ๆ เช่นหมายเลขตัวระบุอนุกรมบิตมาสก์รหัสสี่ไบต์ ฯลฯ
สำหรับวัตถุประสงค์เหล่านั้นenum
ดีมากและคุณควรใช้มันอย่างแน่นอน (ดียิ่งขึ้นใช้และแมโคร .) สำหรับสิ่งอื่น ๆ ที่คุณจะต้องใช้อย่างอื่นนั้น ไม่ได้ทำอะไรนอกจากจำนวนเต็มNS_ENUM
NS_OPTIONS
enum
และคำถามอื่น ๆ
ฉันคิดเกี่ยวกับการนำเข้าไฟล์ในไฟล์ Reddit-Prefix.pch เพื่อให้ค่าคงที่พร้อมใช้งานสำหรับไฟล์ทั้งหมด มันเป็นวิธีที่ดีในการทำสิ่งต่าง ๆ ?
อาจไม่เป็นอันตราย แต่อาจมากเกินไป นำเข้าส่วนหัวค่าคงที่ที่คุณต้องการ
กรณีการใช้งานสำหรับโซลูชันแต่ละรายการมีอะไรบ้าง
#define
: ค่อนข้าง จำกัด ฉันไม่แน่ใจว่ามีเหตุผลที่ดีที่จะใช้สิ่งนี้กับค่าคงที่อีกต่อไป
const
: ดีที่สุดสำหรับค่าคงที่ในท้องถิ่น นอกจากนี้คุณต้องใช้สิ่งนี้กับสิ่งที่คุณประกาศไว้ในส่วนหัวและตอนนี้กำลังกำหนด
static const
: ดีที่สุดสำหรับค่าคงที่ของไฟล์ (หรือคลาสเฉพาะ)
extern const
: คุณต้องใช้สิ่งนี้เมื่อส่งออกค่าคงที่ในส่วนหัว
นอกจากนี้หากใช้extern const
ฉันต้องนำเข้าไฟล์มิเช่นนั้นค่าคงที่จะพร้อมใช้งานทั่วโลกโดยไม่ต้องนำเข้าไฟล์หรือไม่
คุณต้องนำเข้าไฟล์ไม่ว่าจะในแต่ละไฟล์ที่คุณใช้หรือในส่วนหัวของคำนำหน้า