Objective c 在目标C中,我将在哪里放置全局效用函数?

Objective c 在目标C中,我将在哪里放置全局效用函数?,objective-c,ios,xcode,cocoa,Objective C,Ios,Xcode,Cocoa,在编写iOS应用程序时,我会将我打算从任何其他文件中使用的函数放在哪里 例如,将NSDate转换为相对时间字符串(“5秒前”)的函数。 我会创建一个类并使这些函数都是静态的吗?如果您在一个类中使所有函数都是静态的,那么另一种方法是只在.m文件中定义函数,在.h文件中定义外部函数,就像在C中所做的那样。您有两个选项: 1) 如果您正在扩展一个类的行为(例如您描述的NSDate字符串转换方法),那么最好只需在所述类上创建一个类别 以下是有关iOS类别的教程: 重要提示: 类别会在项目中的任何位置更

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

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

如果您在一个类中使所有函数都是静态的,那么另一种方法是只在.m文件中定义函数,在.h文件中定义外部函数,就像在C中所做的那样。

您有两个选项:

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

以下是有关iOS类别的教程:

重要提示:

类别会在项目中的任何位置更改类的行为(如果重写了方法),无论是否在其他特定类的导入中包含头(.h)文件

出于这个原因,通常最好不要通过一个类别重写方法,而是创建一个子类来更改某些方法

但是,对于添加新方法,类别可能非常方便和有用

2) 如果您想创建一个到处导入的新类,您可以创建所述类并将其标题导入,即导入“MyClass.h”,放入项目的
prefix.pch
文件中(默认情况下位于项目中的“支持文件”组下)

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

我希望这有帮助。如果需要进一步澄清,请告诉我,我将尽我所能提供帮助


干杯

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


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

另一个选项是为帮助器方法创建一个类,并将所有帮助器实现为类方法

e、 g.HelperClass.h

+ (NSString *)getFrenchCapital
e、 g.HelperClass.m

+ (NSString *)getFrenchCapital
{
    return @"Paris";
}
#import "HelperClass.h"

...

- (void)logFrenchCapital
{
    NSLog(@"Capital of France: %@", [HelperClass getFrenchCapital]);
} 
然后在需要的地方导入助手类,只需调用类方法:

e、 g.Foo.m

+ (NSString *)getFrenchCapital
{
    return @"Paris";
}
#import "HelperClass.h"

...

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

我认为问题是在哪里放置函数而不是方法。根据他的例子,我更可能使用类方法。。。虽然你说得对,但作者确实提到了创建C函数。+1表示一个类别。
NSDate
上的实例方法(不是类方法)将是处理此特定示例的完美方法。@noa,你是对的,我指的是根据询问者的示例在类别上使用实例方法(不是类方法…;)用Objective-C的说法,你不会把“函数”放在一个类中,让它们成为“静态的”。而是将“类方法”添加到类中。你的问题模棱两可,因为还有静态函数(一个不相关的C概念)。@NikolaiRuhe,目标C是建立在C的基础上的——创建一个C函数没有什么错,如果这是根据具体情况最有效的方法。虽然,我同意通常人们会更经常地为iOS开发创建类方法。@jrgdeveloper我觉得Ryan谈论的是类方法的概念,而不是静态C函数。他只是使用了在其他语言中很常见的术语,而不是objc。@NikolaiRuhe没有人阻止你将所有应用程序代码放入普通的旧C过程中——不过,我想我们在这里讨论的是风格和最佳实践。