如何在两个单独的类中访问值

时间:2014-04-23 08:02:45

标签: objective-c

我会变得非常简单。

如何在一个班级map.m

中设置这些变量
static const uint32_t buildingStructureCategory = 0x1 << 0;
static const uint32_t buildingWindowCategory = 0x1 << 1;
static const uint32_t buildingSignCategory = 0x1 << 2;
static const uint32_t buiildingSignCategory = 0x1 << 3;
static const uint32_t buildingDoorCategory = 0x1 << 4;
static const uint32_t buildingRoofCategory = 0x1 << 5;

还可以查看game.m

中的设置值

所以说我希望buildingStructureCategory NSLog中的game.m值{{1}}

我该怎么做?

5 个答案:

答案 0 :(得分:1)

你的问题令人困惑。如果在map.m中创建这些常量,它们将仅在本地可见(im map.m)。

如果要在另一个类(而不是map)中使用常量,则应在头文件(例如map.h)中定义它们,并将其导入到game.h中。但是,这会将map.h中定义的所有其他内容暴露给game.h和game.m。

您可能需要考虑为常量创建一个单独的类,并在需要的地方导入(例如map.h和game.h)。这样,你的常量(以及只有你的常量)对任何需要使用它们的对象都是可见的。

哦,你应该摆脱static关键字,实际上没有必要。

答案 1 :(得分:1)

您需要做的就是将实施文件(.m)移到头文件(.h),而在实施文件中,只能在您的实施文件中访问它们,而不是其他地方但是当您将它们移动到标题文件后,您就可以在import map.h的课程中访问它们,以便更改为

#import ..... // Whatever imports you need in your header file 

const uint32_t buildingStructureCategory = 0x1 << 0;
const uint32_t buildingWindowCategory = 0x1 << 1;
const uint32_t buildingSignCategory = 0x1 << 2;
const uint32_t buiildingSignCategory = 0x1 << 3;
const uint32_t buildingDoorCategory = 0x1 << 4;
const uint32_t buildingRoofCategory = 0x1 << 5;

@interface Map : NSObject // Or whatever your Map class is a subclass of
// Whatever else you require in your header file.
@end

然后,无论何时#import "Map.h",您都可以轻松访问常量。

你之所以在你的Map课程中而不是在另一个课程中的原因是因为这些课程明显与你的Map课程有关,而且只有在使用{{1}时才需要使用它们类,没有其他类,所以没有逻辑上的理由将这些添加到单独的头文件,你也必须单独导入,但如果你想采取那个似乎没有任何意义的路径所以你可以看一下这个答案Referencing a static NSString * const from another class

答案 2 :(得分:0)

创建NSObject类并删除.m文件。 只需要.h个文件,然后

static const uint32_t buildingStructureCategory = 0x1 << 0;
static const uint32_t buildingWindowCategory = 0x1 << 1;
static const uint32_t buildingSignCategory = 0x1 << 2;
static const uint32_t buiildingSignCategory = 0x1 << 3;
static const uint32_t buildingDoorCategory = 0x1 << 4;
static const uint32_t buildingRoofCategory = 0x1 << 5;

然后您要导入该类,然后您可以访问项目的任何位置

答案 3 :(得分:-1)

如果要从多个类访问对象,请将其转换为Singleton共享对象。所以你可以从任何时候访问它。

答案 4 :(得分:-1)

我在map.m中创建了一个名为createCategories:的方法。它所做的就是将值分配给每个实例变量,该变量是根据我在@property中声明的map.h创建的

map.h

@interface map : SKNode

@property uint32_t buildingStructureCategory;
@property uint32_t buildingWindowCategory;
@property uint32_t buildingSignCategory;
@property uint32_t buiildingSignCategory;
@property uint32_t buildingDoorCategory;
@property uint32_t buildingRoofCategory;

map.m

-(void)createCategories{

    _buildingStructureCategory = 0x1 << 0;
    _buildingWindowCategory = 0x1 << 1;
    _buildingSignCategory = 0x1 << 2;
    _buiildingSignCategory = 0x1 << 3;
    _buildingDoorCategory = 0x1 << 4;
    _buildingRoofCategory = 0x1 << 5;

}

然后allocinit分配并初始化实例对象之后map classgame.m的实例对象,然后调用方法createCategories: 并使用map.m中的变量,因为我对点语法感到满意。

-(SKSpriteNode*)createCharacter{

    categoryBitManager = [[ProceduralMapGeneration alloc]init]; //alloc and init instance object
    [categoryBitManager createCategories]; //calling method to set property values

    NSString *characterString = [NSString name:@"Player" andRetinaBool:_retina];

    SKSpriteNode *character = [SKSpriteNode spriteNodeWithImageNamed:characterString];

    character.name = @"character";
    character.size = CGSizeMake(10, 10);
    character.position = CGPointMake(self.scene.size.width/2, self.scene.size.height/2);
    character.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:character.size];
    character.physicsBody.categoryBitMask = playerCategory;
    character.physicsBody.collisionBitMask = categoryBitManager.buildingStructureCategory; // accessing property

    NSLog(@"the value is %u",character.physicsBody.collisionBitMask); //testing is value is same as in map.m


    return character;
}