【问题标题】:constants in an Objective-C projectObjective-C 项目中的常量
【发布时间】:2012-10-12 18:59:35
【问题描述】:

我正在使用 Cocos2D for iPhone 创建一个游戏。以下表达式出现在代码周围的几个地方:

CGFloat screenCenter = [CCDirector sharedDirector].winSize.width / 2.0;

我想把它放在一个常量文件或类似文件中,这样表达式就不会在整个地方重复。一个想法是把

#define SCREEN_CENTER [CCDirector sharedDirector].winSize.width / 2.0

Constants.h 中并根据需要导入。但是我的印象是,在 Objective-C 中以某种身份使用 static const 是更好的风格/实践。

如何使用static const 在一个地方声明screenCenter,然后根据需要在整个代码中重复使用它?

这样做的一个潜在好处是只进行一次除法,而不是每次计算屏幕中心。

【问题讨论】:

    标签: objective-c static constants


    【解决方案1】:

    这不是编译时表达式,因此您不能将其设为static const

    如果你想保留#define,你需要在它周围加上括号,否则你可能会引入一些细微的错误。

    您可能还想考虑使用内联函数

    inline CGFloat screenCenter() {
        return [CCDirector sharedDirector].winSize.width / 2.0f;
    }
    

    或者你可以直接把它挂在CCDirector 上。假设您不拥有该类,则可以使用类别

    @interface CCDirector (FunkyStuff)
    - (CGFloat)screenCenter;
    @end
    
    @implementation CCDirector (FunkyStuff)
    - (CGFloat)screenCenter {
        return self.winSize.width / 2.0f;
    }
    @end
    
    ...
    x = [[CCDirector sharedDirector] screenCenter];
    

    为了更加方便,您甚至可以将其变成类方法。

    【讨论】:

    • @SundayMonday:嗯,你希望它在const 中,所以我假设你试图最小化执行时间。 inline 函数允许编译器跳过函数调用的开销,并将定义直接内联到调用点。请注意,这要求函数实现在头文件中。或者您可以跳过 inline 部分,因为函数调用开销可能不会成为问题。
    • +1 我明白了。您如何看待仅初始化一次的静态全局变量(只要屏幕宽度可用)?
    • @SundayMonday:这当然是一种选择,尽管您必须小心不要从任何不允许的地方修改它。这也假设屏幕尺寸不可能改变(我猜这是一个安全的假设,但我不知道 Cocos2D 所以我不知道这个事实)。
    猜你喜欢
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    相关资源
    最近更新 更多