我会在Objective C中放置一个全局效用函数?

Rya*_*yan 19 xcode cocoa objective-c ios

在编写iOS应用程序时,我会在哪里放置一个我打算在其他任何文件中使用的函数?

例如,将NSDate转换为相对时间字符串的函数("5秒前").我会创建一个类并使这些函数都是静态的吗?

jle*_*ehr 18

可以在任何方便的地方放置功能.如果可能在许多地方导入函数或函数组,则可以在它们自己的.h/.m对中声明和实现它们.例如,您可以在名为XYZDateUtilities.m的文件中实现日期转换功能,并在XYZDateUtilities.h中声明它.

使用static限定符声明函数会将其范围限制为声明它们的文件,因此您不希望这样做; 实际上你想做相反的事情 - extern在.h文件中声明它们,以便它们在其他文件中可见.


JRG*_*per 10

你有几个选择:

1)如果您正在扩展类的行为(例如您描述的NSDate字符串转换方法),则最好只在该类上创建一个类别.

这是关于iOS类别的教程:

http://mobile.tutsplus.com/tutorials/iphone/objective-c-categories/

重要的提示:

无论是否在另一个特定类的导入中包含标题(.h)文件,类别都会更改类的行为(如果您覆盖方法)

出于这个原因,通常最好不要通过类别覆盖方法,而是要在需要更改某些方法时创建子类.

但是,为了添加新方法,类别可以非常方便和有用.

2)如果要创建一个在任何地方导入的新类,可以创建所述类并将其标题导入#import "MyClass.h"到项目的prefix.pch文件中(默认情况下位于项目中的"支持文件"组下).

您放入prefix.pch文件的任何内容都可以在您的应用内的任何位置使用.这也是放置常量(例如字符串)或定义应用程序中许多类之间使用的枚举的有用位置.

我希望这有帮助.如果需要进一步澄清,请告诉我,我会尽力帮助您.

干杯!

  • +1表示类别.`NSDate`上的实例方法(不是类方法)将是处理这个特定示例的完美方式. (2认同)

Jog*_*Jog 6

另一种选择是为您的助手方法创建一个类,并将所有助手实现为类方法.

例如HelperClass.h

+ (NSString *)getFrenchCapital
Run Code Online (Sandbox Code Playgroud)

例如HelperClass.m

+ (NSString *)getFrenchCapital
{
    return @"Paris";
}
Run Code Online (Sandbox Code Playgroud)

然后在任何需要的地方导入助手类,并简单地调用类方法:

例如,Foo.m

#import "HelperClass.h"

...

- (void)logFrenchCapital
{
    NSLog(@"Capital of France: %@", [HelperClass getFrenchCapital]);
} 
Run Code Online (Sandbox Code Playgroud)