Objective-C'de bir ENUM'u nasıl tanımlayabilir ve kullanabilirim?


180

Uygulama dosyamda aşağıda gösterildiği gibi bir numaralandırma ve arayüzümde bu türden bir değişkeni PlayerState thePlayerState olarak bildirdim; ve değişkeni yöntemlerimde kullandım. Ama bunun bildirilmediğine dair hatalar alıyorum. Yöntemlerimde PlayerState türünde bir değişkeni nasıl doğru bir şekilde bildirebilir ve kullanabilirim ?:

.M dosyasında

@implementation View1Controller

    typedef enum playerStateTypes
        {
            PLAYER_OFF,
            PLAYER_PLAYING,
            PLAYER_PAUSED
        } PlayerState;

.h dosyasında:

@interface View1Controller : UIViewController {

    PlayerState thePlayerState;

.m dosyasındaki bazı yöntemlerde:

-(void)doSomethin{

thePlayerState = PLAYER_OFF;

}

2
Şimdi enum türü ThePlayerState. PlayerStateTypes ne olur?
user4951

3
NS_ENUM ve en son modern sözdizimi hakkında bilgi için Mattt Thompson tarafından yayınlanan NS_ENUM & NS_OPTIONS ilanına bakın .
Basil Bourque

Yanıtlar:


109

Kişisel typedefihtiyaçlar başlık dosyası (veya var diğer bazı dosyasında olmak #importaksi derleyici yapmak için hangi boyutta bilmez, çünkü başlığına ed) PlayerStateivar. Bunun dışında bana iyi geliyor.


Ayrı bir dosyaya koyma seçeneği benim durumumda doğru görünüyordu. Bunun iyi bir yaklaşım olup olmadığını bilmiyorum, ama aynı numarayı iki farklı ViewController'da kullanmam gerekiyordu (kendi kendine ve delege / datasource). Delege / veri kaynağı başlığının içe aktarılması bir hatayla sonuçlandı ve basit bir ihtiyaç için çok fazla görünüyor. Bu yüzden enum bildirildi ve her iki viewControllers.h dosyasına içe aktarılan yeni bir .h dosyası oluşturdum. Bir cazibe gibi çalıştı.
Leandro Alves

7
NS_ENUM makrosunu kullanmanızı tavsiye etmeliyiz - çünkü bu en iyi uygulamadır
khebbie

1
Numaralandırmanızın NS_ENUMSwift kodunda kullanılabilir olmasını istiyorsanız, sıralamaları Objective-C kullanarak bildirmeniz gerekir .
smileyborg

@DaveDeLong, Bu 2015 yılında hala geçerli mi? Ben dosyada typedefbeyan var .mve derler ve iyi çalışır.
Iulian Onofrei

@IulianOnofrei, enum'u diğer dosyalarda kullanmanız gerekiyorsa .h dosyasına gider. Sadece bir dosyaya ihtiyacınız varsa, .m dosyasına koymak her zaman mükemmel olmuştur.
Dave DeLong

206

Apple, Swift de dahil olmak üzere daha iyi kod uyumluluğu sağlamaya yardımcı olacak bir makro sağlar. Makroyu kullanmak şöyle görünür.

typedef NS_ENUM(NSInteger, PlayerStateType) {
  PlayerStateOff,
  PlayerStatePlaying,
  PlayerStatePaused
};

Burada belgelenmiştir


Obj C Numaralarının Java'da olduğu gibi üye değişkenleri olabilir mi? Öyleyse nasıl?
clocksmith

İkinci çözüm daha mı iyi?
Iulian Onofrei

3
İkinci çözüm NS_ENUMdaha modern olduğu için (kullanmak ) daha iyidir ve sıralamanızın Swift kodunda kullanılabilir olmasını istiyorsanız şimdi Objective-C'de gereklidir.
smileyborg

İkinci çözüm aslında daha iyi olduğunu göstermek için güncellendi.
rebelzach

Apple'ın standart formunda, tür adı her numaralandırma değeri için tekrarlanır.
ThomasW

29

.H dosyasında:

typedef enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
} PlayerState;

1
Diğer SO sorularında böyle bir cevap bulabilirsiniz, ancak enums'ı incelerken önce bu soru ortaya çıktı, bu yüzden cevabı buraya da ekledim.
Ben Flynn

19

Mevcut projelerde NS_ENUM()veya NS_OPTIONS()makrolarını kullanmak isteyebilirsiniz .

typedef NS_ENUM(NSUInteger, PlayerState) {
        PLAYER_OFF,
        PLAYER_PLAYING,
        PLAYER_PAUSED
    };

2
... ve daha da önemlisi, enum'unuzun NS_ENUMSwift kodunda bulunmasını istiyorsanız, Objective-C kullanarak numaralandırma bildirmeniz gerekir.
smileyborg

16

Apple NSString gibi sınıflar için böyle yapar:

Başlık dosyasında:

enum {
    PlayerStateOff,
    PlayerStatePlaying,
    PlayerStatePaused
};

typedef NSInteger PlayerState;

Http://developer.apple.com/ adresindeki Kodlama Yönergeleri'ne bakın.


3
Bu aslında OP'ye yardımcı olmaz. Teknik olarak doğru olsa da, onlara yeniden kullanılabilir bir enum nasıl oluşturulacağını söylemez
RyanR

24
Developer.apple.com sitesine bağlantı vermek gerçekten yararlı değil. Bunun yerine alıntı yapmak istediğiniz başka bir yer var mı?
Brett

Daha önce verilen belgeleri kopyalayın / yapıştırın, ana sayfa olan bağlantı gerçekten başkalarına yardım etmiyor ...
Onder OZCAN


8

NS_OPTIONS veya NS_ENUM kullanmanızı öneririm. Bununla ilgili daha fazla bilgiyi buradan edinebilirsiniz: http://nshipster.com/ns_enum-ns_options/

İşte NS_OPTIONS kullanarak kendi kodumdan bir örnek, bir kenarlık oluşturmak için bir UIView'ın katmanında bir alt katman (CALayer) ayarlar bir yardımcı program var.

H. dosya:

typedef NS_OPTIONS(NSUInteger, BSTCMBorder) {
    BSTCMBOrderNoBorder     = 0,
    BSTCMBorderTop          = 1 << 0,
    BSTCMBorderRight        = 1 << 1,
    BSTCMBorderBottom       = 1 << 2,
    BSTCMBOrderLeft         = 1 << 3
};

@interface BSTCMBorderUtility : NSObject

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color;

@end

.M dosyası:

@implementation BSTCMBorderUtility

+ (void)setBorderOnView:(UIView *)view
                 border:(BSTCMBorder)border
                  width:(CGFloat)width
                  color:(UIColor *)color
{

    // Make a left border on the view
    if (border & BSTCMBOrderLeft) {

    }

    // Make a right border on the view
    if (border & BSTCMBorderRight) {

    }

    // Etc

}

@end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.