Objective-C-də tipləşdirilmiş siyahıyaalma nədir?

Mən prinsipcə, enum nə olduğunu və nə vaxt istifadə edəcəyini başa düşmürəm.

Məsələn:

 typedef enum { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

Burada həqiqətən nə elan edilir?

1053
02 апр. Craig 02 Aprel tarixində təyin edildi. 2009-04-02 00:59 '09 'da 0:59' da 2009-04-02 00:59
@ 15 cavab

Üç şey elan edilir: anonim elan edilmiş bir növü elan edilir, ShapeType bu anonim kOblateSpheroid üçün kOblateSpheroid elan edilir və üç ad kCircle , kRectanglekOblateSpheroid integral sabitlər kimi elan edilir.

Onu qırsın. Ən sadə hallarda, bir qeyd saytı olaraq elan edilə bilər

 enum tagname { ... }; 

Bu, tag tagname ilə bir numaralandırma elan edir. C və Objective-C-də (lakin C ++ deyil), bununla əlaqədar istinadlar enum açar enum əvvəl olmalıdır. Məsələn:

 enum tagname x; // declare x of type 'enum tagname' tagname x; // ERROR in C/Objective-C, OK in C++ 

enum sözünü hər yerdə istifadə etməmək üçün, typedef yarada bilərsiniz:

 enum tagname { ... }; typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname' 

Bu bir xəttdə sadələşdirilə bilər:

 typedef enum tagname { ... } tagname; // declare both 'enum tagname' and 'tagname' 

Nəhayət, enum tagname kullanmamız lazım deyilsə, biz anonim bir enum yapabilir və yalnız typedef adı ilə bəyan edə bilərik:

 typedef enum { ... } tagname; 

İndi, bu halda, biz ShapeType adını anonim numaralandırmanın adı ilə elan edirik. ShapeType həqiqətən, yalnız ayrılmaz bir növüdür və yalnız bəyannamədə göstərilən dəyərlərdən biri olan dəyişənləri bəyan etmək üçün istifadə olunmalıdır (yəni, kCircle , kRectanglekOblateSpheroid ). Buna baxmayaraq, ShapeType dəyişəninə ShapeType fərqli bir dəyər təyin edə bilərsiniz, belə ki hesablama dəyərlərini oxuyarkən diqqətli olmalısınız.

Nəhayət, kCircle , kRectanglekOblateSpheroid qlobal ad boşluğunda ayrılmaz sabitlər kimi elan edilir. Xüsusi dəyərlər göstərilmədikləri üçün kCircle başlayaraq tam ədədlərə təyin olunur, beləliklə kCircle 0, kRectangle 1, kOblateSpheroid isə 2-dir.

1540
02 апр. Cavab Adam Rosenfield tərəfindən verilir 02 Apr. 2009-04-02 01:22 '09 saat 01:22 'da 2009-04-02 01:22

Xcode 4.4-dən bəri bu kimi ədədləri müəyyənləşdirir:

 typedef enum ShapeType : NSUInteger { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

Onlar da rahat NS_ENUM makro təmin edir:

border=0
 typedef NS_ENUM(NSUInteger, ShapeType) { kCircle, kRectangle, kOblateSpheroid }; 

Bu təriflər daha sıx tipli yoxlama və daha yaxşı kod tamamlama təmin edir. Rəsmi NS_ENUM sənədlərini tapa bilmədim, ancaq WWDC 2012-dən buradakı "Müasir Obyektiv-C" videosunu burada izləyə bilərsiniz .

YENİLƏNİB: Buradakı rəsmi sənədlərə istinad edin .

245
06 марта '13 в 12:43 2013-03-06 12:43 Cavab Vladimir Qriqorov tərəfindən verilir 06.03.13 12:43 2013-03-06 12:43

Nömrələmə bir sıra sifariş olunan dəyərləri bəyan edir - typedef sadəcə ona rahat bir ad əlavə edir. 1 element 0 və s.

 typedef enum { Monday=1, ... } WORKDAYS; WORKDAYS today = Monday; 

Yuxarıda yalnız formType etiketlərinin bir siyahısı var.

47
15 марта '12 в 19:31 2012-03-15 19:31 cavab 15 mart 2012- ci il tarixində saat 19 : 30-da veriləcək

kCircle , kRectangle və ya kOblateSpheroid mümkün olan xüsusi növü. Lakin, sayma daxilindəki dəyərlər (kCircle, və s.) Sayımdan kənarda görünür. Bunu nəzərə almaq vacibdir (məsələn, int i = kCircle; ).

34
02 апр. Cavab Brian Mitchell tərəfindən verilir 02 Apr. 2009-04-02 01:04 '09 saat 01:04 'da 2009-04-02 01:04

64 bitlik dəyişiklik üçün güncelleme: 64-bit dəyişikliklər haqqında alma sənədlərinə görə,

Siyahılar da siyahıya alınmışdır: LLVM tərtibçisində qeyd olunan növlər sayının ölçüsünü təyin edə bilər. Bu, bəzi siyahıda olan növlərin sizdən gözləniləndən daha böyük bir ölçüsü ola biləcəyini bildirir. həll bütün digər hallarda olduğu kimi, məlumatların ölçüsü haqqında fərziyyələr vermir. Bunun əvəzinə, hər hansı bir listelenmiş dəyərləri bir dəyişənə düzgün məlumat növü ilə təyin et.

64-bit versiyasını dəstəklədiyiniz təqdirdə, aşağıda göstərildiyi kimi bir növü ilə bir enum yaratmalısınız .

 typedef NS_ENUM(NSUInteger, ShapeType) { kCircle, kRectangle, kOblateSpheroid }; 

və ya

 typedef enum ShapeType : NSUInteger { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

Əks halda, Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType kimi bir xəbərdarlıq ilə nəticələnəcək Implicit conversion loses integer precision: NSUInteger (aka 'unsigned long') to ShapeType

Tez proqramlaşdırma üçün yeniləmə:

Sürətlə sintaksis dəyişməsi var.

 enum ControlButtonID: NSUInteger { case kCircle , kRectangle, kOblateSpheroid } 
28
29 янв. Cavab Mani tərəfindən 29 Yanvarda verilir 2014-01-29 16:08 '14 at 16:08 2014-01-29 16:08

Enum istifadəçi tərəfindən müəyyən edilmiş məlumat növüdür. TEK DATA TYPES Data type dəyişənlərin dəyişənləri yalnız əvvəllər elan edilmiş dəyərləri ala bilər.

 enum month { jan = 1, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec }; enum month this_month; this_month = feb; 

Yuxarıda göstərilən bəyannamədə, ay sayılan bir məlumat növü olaraq elan edilir. Bu dəyərlər dəsti, jan-decdan ibarətdir. Nümerik olaraq, jan 1 dəyərini alır, feb 2 dəyərini və s.

Göstərilən dəyişən bu_month ayla eyni cürdür və sonra feb ilə əlaqəli dəyər təyin olunur. Bu aylıq bəyannamə üçün başlama siyahısında göstərilən hər hansı dəyərlər təyin edilə bilməz.

25
17 окт. Cavab 17 oktyabr tarixində verildi . 2012-10-17 15:08 '12 at 15:08 2012-10-17 15:08

Numaralandırma (sayımın kısaltması) bir sıra dəyərləri (counters) saymaq üçün istifadə olunur. Bir dəyər bir simvolu (söz) ilə təmsil olunan mücərrəd bir şeydir. Məsələn, əsas bir siyahı ola bilər

 enum { xs,s,m,l,xl,xxl,xxxl,xxxxl }; 

Bu siyahı anonim adlanır, çünki onun adının simvolu yoxdur. Amma bu hələ də çox yaxşıdır. Yalnız bu şəkildə istifadə edin:

 enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; 

Tamam. Həyat gözəl və hər şey yaxşı gedər. Amma bir gün myGrandFatherPantSize keçirmək üçün yeni bir dəyişən müəyyən etmək üçün bu enumu yenidən istifadə etməli, sonra yaz:

 enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandFatherPantSize; 

Amma sonra bir sayımcınızın derleyici səhvini ləğv etdiniz. Əslində problem, derleyici ilk olaraq nə etdiyinizə əmin deyil, ikincisi eyni şeyi təsvir edir.

Sonra bir neçə yerlərdə eyni sayğac dəsti (burada xs ... xxxxl) yenidən istifadə etmək istəyirsinizsə, onu unikal bir adla qeyd etməlisiniz. Bu kiti ikinci dəfə istifadə etdiyinizdə, yalnız bir etiket istifadə etməlisiniz. Ancaq unutmayın ki, bu etiket sözcük sayımının əvəzinə deyil, sadəcə bir sayğac dəsti. Daha sonra, hesabatın adi halına gəldikdə baxın. Burada:

 // Here the first use of my enum enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl } myGrandMotherDressSize; // here the second use of my enum. It works now ! enum sizes myGrandFatherPantSize; 

Siz də onu parametr tərifində istifadə edə bilərsiniz:

 // Observe that here, I still use the enum - (void) buyANewDressToMyGrandMother:(enum sizes)theSize; 

Yenidən yazma enumun hər yerdə rahat olmaması və kodun bir az qəribə olduğunu söyləmək olar. Sən haqlısın. Əsl tip daha yaxşı olacaq.

Zirvədə böyük irəliləyişimizin son addımıdır. Sadəcə bir typedef əlavə edərək, bizim sayımızı gerçək bir növə çevirəcəyik. Oh, son, tipedef sizin sinifdə icazə verilmir. Sonra növü bir az daha yüksək müəyyən. Bunu belə edin:

 // enum definition enum sizes { xs,s,m,l,xl,xxl,xxxl,xxxxl }; typedef enum sizes size_type @interface myClass { ... size_type myGrandMotherDressSize, myGrandFatherPantSize; ... } 

Etiketi isteğe bağlı olduğunu unutmayın. Bundan sonra, bu halda burada saylarımızı qeyd etməyəcəyik, amma sadəcə yeni bir növü müəyyənləşdirəcəyik. Ona artıq ehtiyacımız yoxdur.

 // enum definition typedef enum { xs,s,m,l,xl,xxl,xxxl,xxxxl } size_type; @interface myClass : NSObject { ... size_type myGrandMotherDressSize, myGrandFatherPantSize; ... } @end 

ObjectiveC'de XCode ilə inkişaf edirsinizsə, mən sizə NS_ENUM ön əlavə ilə maraqlı makroları açmağa imkan verirəm. Bu, asanlıqla yaxşı ədədlərin müəyyənləşdirilməsinə kömək etməlidir və üstəlik statik analizator tərtib etməzdən qabaq bəzi maraqlı çekləri yerinə yetirməyə kömək edəcəkdir.

Yaxşı siyahısı!

23
10 марта '13 в 21:23 2013-03-10 21:23 Cavab Vincent Zgueb tərəfindən verilir 10 Mart 2013, saat 21:23 2013-03-10 21:23

typedef mövcud dəyişən tipin adını ləğv etmək üçün faydalıdır. Bir məlumat növünə zəng etmək üçün qısa və mənalı bir yol təqdim edir. məsələn:

 typedef unsigned long int TWOWORDS; 

Burada, imzalanmamış uzun int növü TWOWORDS tipi ilə əvəz olunur. Beləliklə, indi yazılı, imzalanmayan uzun int dəyişənləri elan edə bilərik,

 TWOWORDS var1, var2; 

əvəzinə

 unsigned long int var1, var2; 
10
18 июня '13 в 9:03 2013-06-18 09:03 Cavab Rajneesh071 tərəfindən verilir 18 iyun '13, saat 09:03 2013-06-18 09:03
 typedef enum { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

sonra istifadə edə bilərsiniz: -

  ShapeType shape; 

  enum { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

İndi istifadə edə bilərsiniz: -

 enum ShapeType shape; 
7
25 дек. Cavab Vivek Sehrawat tərəfindən verilir 25 dekabr . 2013-12-25 09:14 '13 'da 9:14' da 2013-12-25 09:14

enum, strukturda icra edilə bilməyən sayım elementlərinə dəyərlər təyin etmək üçün istifadə olunur. Buna görə də, hər dəfə tam dəyişəndən istifadə etmək əvəzinə, onu sayımdakı dəyişənlərə verdiyimiz dəyərlə edə bilərik. Varsayılan olaraq, bu, 0 ataması ilə başlanır, lakin hər hansı bir dəyər təyin edə bilərik və hesabdakı sonrakı dəyişən əvvəlki dəyər +1-ə təyin ediləcəkdir.

3
16 марта '14 в 15:45 2014-03-16 15:45 Cavab Priyanka Naik 16 mart '14 saat 15:45 'də verilir 2014-03-16 15:45

typedef bir proqramçıya Objective-C bir növünü digərinə təyin etməyə imkan verir. Məsələn,

typedef int Counter; növü int hesabına bərabər olması üçün Counter tipini müəyyənləşdirir. Bu kodun okunabilirliyini çox yaxşılaşdırır.

2
28 дек. Cavab 28 dekabrda user4398701 tərəfindən verilir . 2014-12-28 01:42 '14 da 1:42 2014-12-28 01:42

Typedef C və C ++-də bir söz. Baz məlumat növləri (char, int, float, double, struct və enum) üçün yeni adlar yaratmaq üçün istifadə olunur.

 typedef enum { kCircle, kRectangle, kOblateSpheroid } ShapeType; 

Burada, bir nömrəli məlumat növü olan ShapeType yaradır və aşağıda göstərildiyi kimi, ShapeType numaralandırma növü üçün yeni adlar yaza bilərik

 ShapeType shape1; ShapeType shape2; ShapeType shape3; 
2
16 нояб. Cavab Yogeesh HT tərəfindən verildi 16 Noyabr. 2015-11-16 15:33 '15 'də 15:33' de 15-11-2014, 15:33

Aşağıdakı formatdan istifadə edə bilərsiniz, beləliklə 0-dan başlayan orijinal əsl dəyər

  • kCircle = 0,
  • kRectangle 1,
  • kOblateSpheroid - 2.

Öz ilkin dəyərinizi təyin edə bilərsiniz.

 typedef enum : NSUInteger { kCircle, // for your value; kCircle = 5, ... kRectangle, kOblateSpheroid } ShapeType; ShapeType circleShape = kCircle; NSLog(@"%lu", (unsigned long) circleShape); // prints: 0 
2
30 марта '16 в 12:41 2016-03-30 12:41 Cavab Bilal Arslan tərəfindən 30 Mart 16: 12-də 2016-03-30 12:41 tarixində verilir
 typedef NS_OPTIONS(NSInteger, BaseButtonType){ BaseBarButtonType = 1, BasePrimaryButtonType, // Yellow Button BaseSecondaryButtonType, // Light Gray Button BaseTertiaryButtonType // Red Button };`declaration` 

Bildirin:

 -(void)setButtonType:(BaseButtonType)iButtonType{ buttonType = iButtonType; }`set button enum` 

Başqa bir vəziyyətlə istifadə edə bilərsiniz:

 switch (buttonType) { case BasePrimaryButtonType: break; case BaseSecondaryButtonType: break; case BaseTertiaryButtonType: break; default: break; } `Use` 
0
03 дек. Cavab Viraj Patel 03 dekabrda verilir. 2017-12-03 06:56 '17 saat 06:56 ' də 2017-12-03 06:56

enum "səhv" növlərinin sayını azalda bilər və kodu daha idarə edə bilər

 #define STATE_GOOD 0 #define STATE_BAD 1 #define STATE_OTHER 2 int STATE = STATE_OTHER 

Təyin heç bir məhdudiyyət yoxdur. Bu yalnız bir dəyişiklikdir. Dövlətin bütün şərtlərini məhdudlaşdırmaq mümkün deyil. DÖVLƏT 5-ə təyin edildikdə, proqram düzgün olmayacaq, çünki müvafiq dövlət yoxdur. Lakin kompilyator STATE = 5 xəbərdarlıq etməyəcək

Yəni istifadə etmək daha yaxşıdır

 typedef enum SampleState { SampleStateGood = 0, SampleStateBad, SampleStateOther } SampleState; SampleState state = SampleStateGood; 
0
21 июня '18 в 9:29 2018-06-21 09:29 Marcus Thornton tərəfindən verilən cavab 21 İyun '18 'də 9:29 2018-06-21 09:29

haqqında digər suallar və ya bir sual soruşur