Pertanyaan pertama adalah ruang lingkup yang Anda inginkan dari konstanta Anda, yang sebenarnya adalah dua pertanyaan:
- Apakah konstanta ini khusus untuk satu kelas, atau apakah masuk akal untuk menggunakannya di seluruh aplikasi?
- Jika mereka khusus kelas, apakah mereka untuk digunakan oleh klien dari kelas, atau hanya di dalam kelas?
Jika mereka spesifik dan internal untuk satu kelas, menyatakan mereka sebagai static const
di atas file .m, seperti:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Jika mereka berkaitan dengan satu kelas tetapi harus publik / digunakan oleh kelas lain, nyatakan mereka sebagai extern
di header dan mendefinisikannya di .m:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Jika harus bersifat global, deklarasikan dalam tajuk dan tentukan dalam modul yang sesuai, khususnya untuk konstanta tersebut.
Anda dapat mencampur dan mencocokkan ini untuk konstanta yang berbeda dengan tingkat yang berbeda tentang bagaimana global yang Anda inginkan, dan untuk konstanta global yang berbeda yang tidak termasuk bersama — Anda dapat menempatkannya dalam modul terpisah, masing-masing dengan header sendiri, jika Anda ingin.
Kenapa tidak #define
?
Jawaban lama adalah "makro tidak memiliki informasi tipe", tetapi kompiler saat ini cukup pintar melakukan semua pengecekan tipe untuk literal (makro yang diperluas) serta variabel.
Jawaban modern adalah karena debugger tidak akan tahu tentang makro Anda. Anda tidak bisa mengatakan [myThing addObserver:self forKey:MyThingNotificationKey]
dalam perintah debugger jikaMyThingNotificationKey
makro; debugger hanya bisa mengetahuinya jika itu adalah variabel.
Kenapa tidak enum
?
Nah, rmaddy mengalahkan saya dalam komentar: enum
hanya dapat mendefinisikan konstanta integer. Hal-hal seperti nomor pengenal serial, bit-mask, kode empat byte, dll.
Untuk keperluan itu, enum
sangat bagus dan Anda benar-benar harus menggunakannya. (Bahkan lebih baik, gunakan yang NS_ENUM
dan NS_OPTIONS
macro .) Untuk hal-hal lain, Anda harus menggunakan sesuatu yang lain; enum
tidak melakukan apa pun kecuali bilangan bulat.
Dan pertanyaan lainnya
Saya berpikir tentang mengimpor file dalam file Reddit-Prefix.pch untuk membuat konstanta tersedia untuk semua file. Apakah ini cara yang baik untuk melakukan sesuatu?
Mungkin tidak berbahaya, tetapi mungkin berlebihan. Impor tajuk konstanta Anda di tempat yang Anda butuhkan.
Apa kasus penggunaan untuk masing-masing solusi tersebut?
#define
: Cukup terbatas. Sejujurnya saya tidak yakin ada alasan yang baik untuk menggunakan ini untuk konstanta.
const
: Terbaik untuk konstanta lokal. Selain itu, Anda harus menggunakan ini untuk yang Anda deklarasikan di header dan sekarang mendefinisikan.
static const
: Terbaik untuk konstanta khusus file (atau khusus kelas).
extern const
: Anda harus menggunakan ini saat mengekspor konstanta di header.
Juga, jika menggunakan extern const
, apakah saya perlu mengimpor file, atau konstanta akan tersedia secara global tanpa mengimpor file?
Anda perlu mengimpor file, baik di setiap file di mana Anda menggunakannya atau di header awalan.