Objective-C-də sabitlər

Mən Kakao tətbiqini inkişaf NSString və mənim parametrlərim üçün əsas adları saxlamaq üçün NSString sabitini istifadə edirəm.

Anladım ki, bu yaxşı bir fikirdir, çünki zəruri hallarda açarları dəyişdirmək asanlaşır. Bundan əlavə, bu konsepsiya "məlumatlarınızı məntiqlə paylaşır."

Hər halda, bütün tətbiq üçün bir dəfə müəyyən edilmiş sabitləri etmək üçün yaxşı bir yol varmı? Əminəm ki, sadə və ağlabatan bir yol var, amma indi dərslərim sadəcə istifadə etdiyin kimidir.

981
12 февр. Allyn 12 fevralda təyin olundu 2009-02-12 00:52 '09 at 12:52 AM 2009-02-12 00:52
@ 15 cavab

Məsələn bir başlıq faylını yaratmalısınız

 // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT NSString *const MySecondConstant; //etc. 

(kodunuzu C / C ++ ortamlarında və ya digər platformalarda istifadə olunmayacaqsa, FOUNDATION_EXPORT əvəzinə extern istifadə edə bilərsiniz)

Bu faylı sabit üçün istifadə olunan hər bir faylda və ya bir layihə üçün precompiled başlıqda əlavə edə bilərsiniz.

Məsələn, bu sabitləri .m faylında müəyyənləşdirirsiniz

 // Constants.m NSString *const MyFirstConstant = @"FirstConstant"; NSString *const MySecondConstant = @"SecondConstant"; 

Sabit .m son məhsulla əlaqəli olması üçün tətbiq / çərçivə hədəfinə əlavə edilməlidir.

#define 'd sabitlerinin yerinə simli sabitlərin istifadə edilməsinin üstünlüyü, simli müqayisədən daha sürətli olan pointer müqayisəsi ( stringInstance == MyFirstConstant ) istifadə edərək, bərabərlik test edə bilərsiniz (və [stringInstance isEqualToString:MyFirstConstant] oxumaq daha asan [stringInstance isEqualToString:MyFirstConstant] IMO).

1261
12 февр. Cavab Barry Wark tərəfindən 12 Fevralda verilir . 2009-02-12 01:38 '09 at 1:38 'da 2009-02-12 01:38

Ən asan yol:

 // Prefs.h #define PREFS_MY_CONSTANT @"prefs_my_constant" 

Ən yaxşı şəkildə:

border=0
 // Prefs.h extern NSString * const PREFS_MY_CONSTANT; // Prefs.m NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant"; 

Birincisinin üstünlüklərindən biri, sabit bir dəyərin dəyişdirilməsi bütün proqramınızın yenidən qurulmasına gətirib çıxarmır.

269
12 февр. Cavab 12 fevralda Andrew Grant tərəfindən verilir. 2009-02-12 01:02 '09 at 1:02 2009-02-12 01:02

Bir də var. Qeyri-qlobal bir sabitliyə ehtiyacınız varsa, static istifadə etməlisiniz.

Misal

 // In your *.m file static NSString * const kNSStringConst = @"const value"; 

static olduğundan static bu sabit fayl xaricində görünmür.


Kiçik düzəliş @QuinnTaylor : statik dəyişənlər yığma qurğunun içərisində görünür. Bu, adətən bir .m faylıdır (bu nümunədə olduğu kimi), ancaq başqa bir yerə daxil edilmiş bir başlıqda bəyan edirsinizsə, bu sizi itələyə bilər, çünki tərtib etdikdən sonra linker səhvləriniz olacaq

184
12 февр. Cavab 12 fevralda kompozer tərəfindən verilir. 2009-02-12 19:28 '09 da 19:28 'da 2009-02-12 19:28

Qəbul edilmiş (və düzgün) cavabda deyilir ki, "bu fayl [Constants.h] ... layihənin precompiled başlığına daxil edə bilərsiniz."

Yeniyetməni kimi mənim üçün daha çox izahat vermədən bunu etmək çətin idi: Sizin YourAppNameHere-Prefix.pch faylında (bu, Xcode-da precompiled header üçün default adıdır), #ifdef __OBJC__ içərisində Constants.h idxal #ifdef __OBJC__ .

 #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import "Constants.h" #endif 

Həmçinin, Constants.h və Constants.m fayllarının qəbul edilmiş cavabda təsvir edilənlərdən başqa heç bir şey olmadığı da qeyd edilməlidir. (No interface və ya tətbiq).

117
18 сент. Cavab Victor Van Hee 18 sep verilir. 2011-09-18 17:08 '11 'də 17:08' də 2011-09-18 17:08

Mən adətən Barry Wark və Rahul Gupta tərəfindən nəşr olunan üsuldan istifadə edirəm.

Baxmayaraq ki, .h və .m fayllarında eyni sözləri təkrarlamaq istəmirəm. Aşağıdakı misalda xətt hər iki faylda demək olar ki, eynidır:

 // file.h extern NSString* const MyConst; //file.m NSString* const MyConst = @"Lorem ipsum"; 

Bəzi C preprocessorlarını istifadə etmək istərdim.

STR_CONST(name, value) müəyyən edən bir başlıq faylı var:

 // StringConsts.h #ifdef SYNTHESIZE_CONSTS # define STR_CONST(name, value) NSString* const name = @ value #else # define STR_CONST(name, value) extern NSString* const name #endif 

Daimi müəyyən etmək istədiyim mənim .h / .m-cütdə aşağıdakıları edəcəyəm:

 // myfile.h #import <StringConsts.h> STR_CONST(MyConst, "Lorem Ipsum"); STR_CONST(MyOtherConst, "Hello world"); // myfile.m #define SYNTHESIZE_CONSTS #import "myfile.h" 

et voila, sabit fayllar haqqında bütün məlumatları yalnız .h faylında tapdım.

50
03 дек. Cavab verilir Krizz 03 dekabr. 2011-12-03 00:53 '11 at 0:53 2011-12-03 00:53

Bu ayarlar üçün istifadə olunan daimi NSStrings elanına həsr olunmuş bir başlıq var:

 extern NSString * const PPRememberMusicList; extern NSString * const PPLoadMusicAtListLoad; extern NSString * const PPAfterPlayingMusic; extern NSString * const PPGotoStartupAfterPlaying; 

Sonra onları müşayiət edən .m faylında elan edirik:

 NSString * const PPRememberMusicList = @"Remember Music List"; NSString * const PPLoadMusicAtListLoad = @"Load music when loading list"; NSString * const PPAfterPlayingMusic = @"After playing music"; NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing"; 

Bu yanaşma mənə yaxşı xidmət etmişdir.

Düzenle: birdən çox faylda strings istifadə edildikdə yaxşı işləyir. Yalnız bir fayl istifadə edildikdə, simli istifadə edən .m faylında #define kNSStringConstant @"Constant NSString" verə bilərsiniz.

25
27 янв. Cavab MaddTheSane Jan 27 verildi 2013-01-27 02:15 '13 'da 2:15' də 2013-01-27 02:15 'də

@Krizz bəndinin yüngül dəyişməsi, belə ki, daimi başlıq faylı PCH-də olduqca normal olduqda düzgün işləməlidir. Orijinal PCH'ye idxal olunduğundan, bu .m faylına yenidən .m və buna görə də hər hansı bir simvol qəbul etmirsiniz və linker təmin edilmir.

Lakin, aşağıdakı dəyişiklik işləməyə imkan verir. Bir az çaşqındır, amma işləyir.

ConstantList.h , fayl .h faylını və faylını ehtiva edən 3 , .h fayllarına ehtiyac .m , mən ConstantList.h , Constants.hConstants.m istifadə edəcəyəm. Constants.h məzmun sadədir:

 // Constants.h #define STR_CONST(name, value) extern NSString* const name #include "ConstantList.h" 

Constants.m faylına bənzəyir:

 // Constants.m #ifdef STR_CONST #undef STR_CONST #endif #define STR_CONST(name, value) NSString* const name = @ value #include "ConstantList.h" 

Nəhayət, ConstantList.h də faktiki bəyanatlar var və bunlar hamısı:

 // ConstantList.h STR_CONST(kMyConstant, "Value"); … 

Bir neçə qeyd:

  • #undef etmək üçün # #undef sonra .m faylında #undef dayandırmaq #undef .

  • Mən də düzgün işləmiş və kompilyatorun daha əvvəl tərtib edilmiş dəyərləri görməsinə icazə verməməsi üçün #import yerinə #include istifadə #import .

  • Bu, hər hansı bir dəyər dəyişdirildikdə PCH (və, ehtimal ki, bütün layihənin) yenidən tərtib edilməsini tələb edir, bu da adi hal kimi bölünür (və təkrarlanır).

Bu birinə kömək edir.

25
03 дек. Cavab Scott Little 03 dekabr tərəfindən verilir . 2011-12-03 03:03 '11 'də 3:03' de 2011-12-03 03:03
 // Prefs.h extern NSString * const RAHUL; // Prefs.m NSString * const RAHUL = @"rahul"; 
14
28 сент. cavab cavan gupta 28 sep verilir . 2011-09-28 07:37 '11 saat 07:37 'da 2011-09-28 07:37

Abizer dediyi kimi, onu PCH faylına yaza bilərsiniz. Çirkli olmayan başqa bir üsul, bütün düymələrinizə daxil olan bir fayl yaratmaq və ya düymələri istifadə etdiyiniz faylya daxil etmək və ya PCH-yə daxil etməkdir. Öz-özünə aid olan faylda yardımı ilə bu ən azı bütün sabitləri axtarmaq və müəyyən etmək üçün bir yer verir.

12
12 февр. Cavab 12 fevralda Grant Limberq tərəfindən verilir. 2009-02-12 01:05 '09 da 1:05 'da 2009-02-12 01:05

Qlobal sabitləri kimi bir şey istəyirsinizsə; sürətli çirkli şəkildə pch faylında daimi elanların qoyulmasıdır.

11
12 февр. Abizern tərəfindən 12 Fevralda cavab verildi . 2009-02-12 00:56 '09 at 0:56 2009-02-12 00:56

Sinfi üsulunu istifadə edin:

 +(NSString*)theMainTitle { return @"Hello World"; } 

Bəzən istifadə edirəm.

7
06 дек. groumpf tərəfindən verilmiş cavab 06 Dekabr. 2009-12-06 12:26 '09 da 12:26 'de 2009-12-06 12:26

Bir sinif klassını istifadə edirəm ki, sinifləri təhqir edə bilərik və test üçün zəruri hallarda sabitləri dəyişə bilərəm. Sabit siniflər aşağıdakılardır:

 #import <Foundation/Foundation.h> @interface iCode_Framework : NSObject @property (readonly, nonatomic) unsigned int iBufCapacity; @property (readonly, nonatomic) unsigned int iPort; @property (readonly, nonatomic) NSString * urlStr; @end #import "iCode_Framework.h" static iCode_Framework * instance; @implementation iCode_Framework @dynamic iBufCapacity; @dynamic iPort; @dynamic urlStr; - (unsigned int)iBufCapacity { return 1024u; }; - (unsigned int)iPort { return 1978u; }; - (NSString *)urlStr { return @"localhost"; }; + (void)initialize { if (!instance) { instance = [[super allocWithZone:NULL] init]; } } + (id)allocWithZone:(NSZone * const)notUsed { return instance; } @end 

Və buna bənzər istifadə olunur (qeyd [[Constants alloc] init] sabitlərin kısaltması c - hər dəfə yazaraq [[Constants alloc] init] saxlayır):

 #import "iCode_FrameworkTests.h" #import "iCode_Framework.h" static iCode_Framework * c; // Shorthand @implementation iCode_FrameworkTests + (void)initialize { c = [[iCode_Framework alloc] init]; // Used like normal class; easy to mock! } - (void)testSingleton { STAssertNotNil(c, nil); STAssertEqualObjects(c, [iCode_Framework alloc], nil); STAssertEquals(c.iBufCapacity, 1024u, nil); } @end 
7
16 июля '12 в 3:00 2012-07-16 03:00 Cavab Howard Lovatt 16 iyul '12 saat 03:00 'da verildi 2012-07-16 03:00

Əgər ad boşluğunun daimi olmasını istərsənsə, bu cədvəldən istifadə edə bilərsiniz Cümə Q A 2011-08-19: Adı əsaslı sabitləri və funksiyaları

 // in the header extern const struct MANotifyingArrayNotificationsStruct { NSString *didAddObject; NSString *didChangeObject; NSString *didRemoveObject; } MANotifyingArrayNotifications; // in the implementation const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = { .didAddObject = @"didAddObject", .didChangeObject = @"didChangeObject", .didRemoveObject = @"didRemoveObject" }; 
7
25 июля '15 в 12:16 2015-07-25 12:16 cavab 25 İyul 2013, 12:16 'də verilir

Bu NSString.newLine; kimi bir şey zəng etmək istəyirsinizsə NSString.newLine; hədəf c-dən və sabit statik olmasını istəyirsənsə, belə bir şəkildə belə bir şey yarada bilərsiniz:

 public extension NSString { @objc public static let newLine = "\n" } 

Stil növü kontekstində məhdudlaşdıqda isə seçdiyiniz hər hansı bir növdən əldə edilə bilən sabit bir yaxşı oxunaqlı tərifiniz var.

0
21 янв. Renetik Jan 21 tərəfindən verilmiş cavab 2019-01-21 20:17 '19 saat 20:17 'da 2019-01-21 20:17

Məqsəd C-də sabitlərin göstərilməsi üçün bu linki yoxlayın. Yalnız faylları yükləyin və onları Layihəyə daxil edin və istifadə edin.

https://github.com/mspviraj/constants-in-Objective-C

Kod nümunəsi:

  #define KAppBackgroundColor 0x202020 #define KSecondaryBackgroundColor 0x333333 #define KAppFontColor 0xffffff #define KAppFontColorAlpha 0 
-2
05 дек. cavab Viraj Patel 05 dekabrda verilir. 2017-12-05 00:24 '17 'də 0:24 2017-12-05 00:24' də

əlaqədar digər suallar və ya bir sual verin