2011-01-16 28 views
7

gibi nokta olarak adlandırılabilecek bir nokta tanımlayın, nesnel-c'deki enum türleri hakkında birçok şey okudum ve bunları tanımlamanın birçok yolu olduğunu görüyorum. Ancak CARS.ROLLSROYCE ile çağrılabilen bir enum tanımlamak için doğru yolu (eğer varsa) görmüyorum ve bu kodda yalnızca ROLLSROYCE ile kullanılamaz.Amaç-C - ENUMTYPE.ENUMVAL

Bu yüzden ROLLSROYCE'i CARS enum'da ve BEAUTIFULCARS enum'da tanımlayabilirim.

Böyle bir enum tanımlamanın yolunu biliyor musunuz?

cevap

3

Nesneleriniz için Object-C'deki ad alanlarını kullanmaya çalışıyorsunuz. İstediğin şey, Objective-C'de bir sürü dirsek yağıdır. Bunun için C++ kullanarak muhtemelen en iyi durumdasınız, çünkü herhangi bir iOS veya Kakao uygulamasında tam olarak desteklenen kolay ve afaik. #import C++ kodunuzu .m dosyaları yerine .mm dosyalarına yeniden adlandırmanız ve C++ derleyicisinin Objective-C one'dan daha zor olabilir. Bu rotaya gitmek, Enums.h gibi bir başlık dosyası oluşturacaksınız.

// Enums.h 
namespace CARS 
{ 
    enum CARS 
    { 
     ROLLSROYCE 
    }; 
} 
namespace BEAUTIFULCARS 
{ 
    enum BEAUTIFULCARS 
    { 
     ROLLSROYCE = 45 
    }; 
} 

Ve bu çözüm için C++ kullanarak kaçınmak istiyorsanız sizin .mm sourcefile

#import "Enums.h" 

-(void)printEnumvals 
{ 
    NSLog(@"CARS %d BEAUTIFULCARS %d", 
        CARS::ROLLSROYCE, 
      BEAUTIFULCARS::ROLLSROYCE); 
} 

yılında

, hata için çok daha fazla el emeği, defter tutma ve fırsat var. Bunun için bir başlık ve bir kaynak dosyaya ihtiyacınız olacak.

// CARS.h 
@interface BEAUTIFULCARS : NSObject 
{ 
    enum 
    { 
     BEAUTIFULCARS_ROLLSROYCE = 45 
    } BEAUTIFULCARS; 
} 
@end 
@interface CARS : NSObject 
{ 
    enum 
    { 
     CARS_ROLLSROYCE 
    } CARS; 
} 
@end 

// CARS.m 
@implementation BEAUTIFULCARS 
+(NSInteger)ROLLSROYCE{ return BEAUTIFULCARS_ROLLSROYCE; } 
@end 
@implementation CARS 
+(NSInteger)ROLLSROYCE{ return CARS_ROLLSROYCE; } 
@end 

Sizin .m kaynak hemen hemen aynıdır:

#import "CARS.h" 

-(void)printEnumvals 
{ 
    NSLog(@"CARS %d BEAUTIFULCARS %d", 
        CARS.ROLLSROYCE, 
      BEAUTIFULCARS.ROLLSROYCE); 
} 

Objective-C diğer birçok OO dilleri yapmak aynı şekilde yönetmesine etmez. Arabirimler, arabirimin desteklediği bir nesnenin özelliklerini ve mesajlarını tanımlar, ancak kamu ya da özel gibi koruma seviyelerini desteklemez. Bir enum bir @interface'da tanımladığınızda, bu enum genel kapsamda biter. Benim durumumda için

+0

@Thomson Comer: bu ad TEST { \t enum TESTİ { \t \t ABC \t \t ///// çalışmaz DEF \t}; } – Oliver

+0

@Thomson Comer: Derleyici, "TEST" – Oliver

+0

@Oliver'den önce "beklenen" = "". "Etc ... 'asm' veya '_attribute_' yazıyor. Bu ad alanı kodunu içeren kaynak dosyayı yeniden adlandırmayı unuttun '.mm' dosyasına .Ad alanları, her zaman ".m" ile eklenmiş Objective-C'de desteklenmez. Bir ad alanı kullandığınızda, C++ kodu olarak ele almanız gerekir, bu da kaynak dosyanın son haline getirilmesini gerektirir. .mm'. –

1

, böyle basit bir durum için gereksiz Objective-C sınıfları C++ ad kullanmak veya yazmak istemedim, bu yüzden

// Enum.h 
typedef struct 
{ 
    const int ROLLSROYCE; 
} _CARS; 

typedef struct 
{ 
    const int ROLLSROYCE; 
} _BEAUTIFULCARS; 

extern const _CARS CARS; 
extern const _BEAUTIFULCARS BEAUTIFULCARS; 

Sonra Enum içinde C'ye

geri düşmüş. m, değerler nihayet

// Enum.m  

#import "Enum.h" 

const _CARS CARS = {0};// 0 is to be assigned to ROLLSROYCE field in struct 
const _BEAUTIFULCARS BEAUTIFULCARS = {1}; // same but with 1 

Ve tanımlamak, "ana" kod

#import "Enum.h" 

// Some method 
{ 
    NSLog(@"I can refer to CARS.ROLLSROYCE = %d and BEAUTIFULCARS.ROLLSROYCE = %d", CARS.ROLLSROYCE, BEAUTIFULCARS.ROLLSROYCE); 
} 

bunu üretecek hangi koyun:

I can refer to CARS.ROLLSROYCE = 0 and BEAUTIFULCARS.ROLLSROYCE = 1