Saya sedang mengembangkan aplikasi Kakao , dan saya menggunakan konstanta NSString
s sebagai cara untuk menyimpan nama-nama kunci untuk preferensi saya.
Saya mengerti ini adalah ide yang bagus karena memungkinkan penggantian kunci yang mudah jika perlu.
Plus, itu seluruh gagasan 'memisahkan data Anda dari logika Anda'.
Lagi pula, adakah cara yang baik untuk membuat konstanta ini didefinisikan sekali untuk seluruh aplikasi?
Saya yakin ada cara yang mudah dan cerdas, tetapi saat ini kelas saya hanya mendefinisikan kembali yang mereka gunakan.
Jawaban:
Anda harus membuat file header seperti
(Anda dapat menggunakan
extern
alih-alihFOUNDATION_EXPORT
jika kode Anda tidak akan digunakan dalam lingkungan campuran C / C ++ atau pada platform lain)Anda dapat memasukkan file ini di setiap file yang menggunakan konstanta atau dalam header yang telah dikompilasi sebelumnya untuk proyek.
Anda mendefinisikan konstanta ini dalam file .m seperti
Constants.m harus ditambahkan ke target aplikasi / kerangka kerja Anda sehingga dikaitkan dengan produk akhir.
Keuntungan menggunakan konstanta string daripada konstanta
#define
d adalah bahwa Anda dapat menguji kesetaraan menggunakan perbandingan pointer (stringInstance == MyFirstConstant
) yang jauh lebih cepat daripada perbandingan string ([stringInstance isEqualToString:MyFirstConstant]
) (dan lebih mudah dibaca, IMO).sumber
NSString
properti merekacopy
alih - alihretain
. Dengan demikian, mereka bisa (dan harus) memegang contoh berbeda dariNSString*
konstanta Anda , dan perbandingan alamat memori langsung akan gagal. Juga, saya akan menganggap bahwa setiap implementasi yang cukup optimal-isEqualToString:
akan memeriksa kesetaraan pointer sebelum masuk ke seluk-beluk perbandingan karakter.Cara termudah:
Cara yang lebih baik:
Salah satu manfaat yang kedua adalah bahwa mengubah nilai konstanta tidak menyebabkan pembangunan kembali seluruh program Anda.
sumber
extern NSString const * const MyConstant
, yaitu membuatnya menjadi pointer konstan ke objek konstan, bukan hanya pointer konstan?Ada juga satu hal yang perlu disebutkan. Jika Anda membutuhkan konstanta non global, Anda harus menggunakan
static
kata kunci.Contoh
Karena
static
kata kunci, const ini tidak terlihat di luar file.Koreksi kecil oleh @QuinnTaylor : variabel statis terlihat di dalam unit kompilasi . Biasanya, ini adalah file .m tunggal (seperti dalam contoh ini), tetapi ini dapat menggigit Anda jika Anda mendeklarasikannya di header yang disertakan di tempat lain, karena Anda akan mendapatkan kesalahan tautan setelah kompilasi
sumber
Jawaban yang diterima (dan benar) mengatakan bahwa "Anda dapat memasukkan file [Constants.h] ini ... di header yang sudah dikompilasi untuk proyek."
Sebagai seorang pemula, saya mengalami kesulitan melakukan ini tanpa penjelasan lebih lanjut - inilah caranya: Di file YourAppNameHere-Prefix.pch Anda (ini adalah nama default untuk header yang dikompilasi sebelumnya dalam Xcode), impor Konstanta Anda. H di dalam
#ifdef __OBJC__
blok .Juga perhatikan bahwa file Constants.h dan Constants.m harus benar-benar tidak mengandung apa pun di dalamnya kecuali apa yang dijelaskan dalam jawaban yang diterima. (Tidak ada antarmuka atau implementasi).
sumber
Saya biasanya menggunakan cara yang diposting oleh Barry Wark dan Rahul Gupta.
Meskipun, saya tidak suka mengulang kata-kata yang sama di file .h dan .m. Perhatikan, bahwa dalam contoh berikut ini, baris hampir identik di kedua file:
Oleh karena itu, yang ingin saya lakukan adalah menggunakan beberapa mesin preprosesor C. Biarkan saya jelaskan melalui contoh.
Saya memiliki file header yang mendefinisikan makro
STR_CONST(name, value)
:Pasangan saya .h / .m di mana saya ingin mendefinisikan konstanta saya melakukan hal berikut:
et voila, saya memiliki semua informasi tentang konstanta dalam file .h saja.
sumber
Saya sendiri memiliki header yang didedikasikan untuk mendeklarasikan NSStrings konstan yang digunakan untuk preferensi seperti:
Kemudian mendeklarasikannya dalam file .m yang menyertainya:
Pendekatan ini sangat membantu saya.
Sunting: Perhatikan bahwa ini berfungsi paling baik jika string digunakan dalam banyak file. Jika hanya satu file yang menggunakannya, Anda bisa melakukannya
#define kNSStringConstant @"Constant NSString"
di file .m yang menggunakan string.sumber
Sedikit modifikasi dari saran @Krizz, sehingga berfungsi dengan baik jika file header konstanta dimasukkan dalam PCH, yang agak normal. Karena aslinya diimpor ke PCH, itu tidak akan memuatnya kembali ke dalam
.m
file dan dengan demikian Anda tidak mendapatkan simbol dan linker tidak senang.Namun, modifikasi berikut memungkinkannya berfungsi. Agak berbelit-belit, tetapi berhasil.
Anda harus 3 file,
.h
berkas yang memiliki definisi konstan,.h
file dan.m
berkas, saya akan menggunakanConstantList.h
,Constants.h
danConstants.m
masing-masing. isinyaConstants.h
sederhana:dan
Constants.m
file tersebut terlihat seperti:Akhirnya,
ConstantList.h
file tersebut memiliki deklarasi aktual di dalamnya dan itu saja:Beberapa hal yang perlu diperhatikan:
Saya harus mendefinisikan ulang makro dalam
.m
file setelah#undef
itu untuk makro yang akan digunakan.Saya juga harus menggunakan
#include
alih-alih#import
agar ini berfungsi dengan baik dan menghindari kompilator melihat nilai yang sebelumnya dikompilasi.Ini akan membutuhkan kompilasi ulang PCH Anda (dan mungkin seluruh proyek) setiap kali ada nilai yang berubah, yang tidak terjadi jika mereka dipisahkan (dan digandakan) seperti biasa.
Semoga bermanfaat bagi seseorang.
sumber
extern
atas denganFOUNDATION_EXPORT
.sumber
Seperti kata Abizer, Anda bisa memasukkannya ke file PCH. Cara lain yang tidak begitu kotor adalah dengan membuat file include untuk semua kunci Anda dan kemudian memasukkannya ke dalam file yang Anda gunakan kunci tersebut, atau, memasukkannya ke dalam PCH. Dengan mereka di file sertakan mereka sendiri, yang setidaknya memberi Anda satu tempat untuk mencari dan mendefinisikan semua konstanta ini.
sumber
Jika Anda menginginkan sesuatu seperti konstanta global; cara cepat yang kotor adalah dengan meletakkan deklarasi konstan ke dalam
pch
file.sumber
Coba gunakan metode kelas:
Terkadang saya menggunakannya.
sumber
isEqualToString:
untuk perbandingan, yang merupakan biaya lebih lanjut saat dijalankan. Saat Anda menginginkan konstanta, buat konstanta.Jika Anda suka namespace konstan, Anda dapat memanfaatkan struct, Friday Q&A 2011-08-19: Konstanta dan Fungsi Bernama Tingkatan
sumber
__unsafe_unretained
kualifikasi untuk membuatnya berfungsi.Saya menggunakan kelas singleton, sehingga saya bisa mengejek kelas dan mengubah konstanta jika perlu untuk pengujian. Kelas konstanta terlihat seperti ini:
Dan ini digunakan seperti ini (perhatikan penggunaan steno untuk konstanta c - menghemat mengetik
[[Constants alloc] init]
setiap waktu):sumber
Jika Anda ingin memanggil sesuatu seperti ini
NSString.newLine;
dari objektif c, dan Anda ingin itu konstan statis, Anda dapat membuat sesuatu seperti ini dengan cepat:Dan Anda memiliki definisi konstan yang dapat dibaca, dan tersedia dari dalam jenis pilihan Anda sementara masih terikat ke konteks jenis.
sumber