İlk soru sabitlerinizin hangi kapsamda olmasını istediğinizdir, ki bu gerçekten iki sorudur:
- Bu sabitler tek bir sınıfa özgü mü yoksa uygulamanın her yerinde olması mantıklı mı?
- Sınıfa özelse, sınıfın istemcileri tarafından mı, yoksa yalnızca sınıf içinde mi kullanılırlar?
Tek bir sınıfa özgü ve dahili iseler, bunları static const
.m dosyasının en üstünde olduğu gibi bildirin, şöyle:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Tek bir sınıfa aitse, ancak diğer sınıflar tarafından herkese açık / kullanılması gerekiyorsa, bunları extern
başlıktaki gibi bildirin ve .m'de tanımlayın:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
Küresel olmaları gerekiyorsa, bunları bir başlıkta beyan edin ve özellikle bu sabitler için karşılık gelen bir modülde tanımlayın.
Bunları, küresel olmalarını istediğiniz farklı düzeylerde farklı sabitler ve basitçe bir araya gelmeyen farklı küresel sabitler için karıştırabilir ve eşleştirebilirsiniz; bunları, her biri kendi başlığına sahip ayrı modüllere koyabilirsiniz. istemek.
Neden olmasın #define
?
Eski cevap “makroların tür bilgisi yok”, ancak bugün derleyiciler değişkenlerin yanı sıra değişmez değerler (makroların genişlediği) için tüm tür denetimi yapma konusunda oldukça zekidirler.
Modern cevap, hata ayıklayıcının makrolarınızı bilmemesi. [myThing addObserver:self forKey:MyThingNotificationKey]
Bir hata ayıklayıcı komutunda şunu söyleyemezsiniz :MyThingNotificationKey
makro ; hata ayıklayıcı yalnızca değişkense bunu bilebilir.
Neden olmasın enum
?
Rmaddy yorumlarda beni dövdü: enum
sadece tamsayı sabitlerini tanımlayabilir. Seri tanımlayıcı numaraları, bit maskeleri, dört baytlık kodlar vb.
Bu amaçlar enum
için harika ve kesinlikle kullanmalısınız. (Daha da iyisi, kullanımı ve makro .) Diğer şeyler için, gereken başka bir şey kullanmak; tamsayılardan başka bir şey yapmaz.NS_ENUM
NS_OPTIONS
enum
Ve diğer sorular
Sabitleri tüm dosyalar için kullanılabilir hale getirmek için Reddit-Prefix.pch dosyasındaki dosyayı almayı düşünüyordum. Bir şeyler yapmanın iyi bir yolu mu?
Muhtemelen zararsız, ama muhtemelen aşırı. Sabit başlıklarınızı ihtiyaç duyduğunuz yere aktarın.
Bu çözümlerin her biri için kullanım durumları nelerdir?
#define
: Oldukça sınırlı. Dürüst olmak gerekirse, bunu sabitler için kullanmak için iyi bir neden olduğundan emin değilim.
const
: Yerel sabitler için en iyisi. Ayrıca, bunu bir başlıkta bildirdiğiniz ve şimdi tanımladığınız biri için kullanmanız gerekir.
static const
: Dosyaya özgü (veya sınıfa özgü) sabitler için en iyisi.
extern const
: Üstbilgideki bir sabiti dışa aktarırken bunu kullanmalısınız.
Ayrıca, kullanılıyorsa extern const
dosyayı içe aktarmam gerekir mi yoksa sabitler dosyayı içe aktarmadan global olarak kullanılabilir mi?
Dosyayı, kullandığınız her dosyada veya önek başlığında içe aktarmanız gerekir.