我们必须为Utility类创建接口吗?

时间:2014-08-29 20:23:06

标签: ios objective-c

我是iOS新手并试图了解Objective-C世界,以便我可以编写惯用代码。我来自Java背景。

我想创建一个实用程序类,以便可以跨视图控制器共享一些静态方法。我看到了这个 - iOS - how do I create a "utility" class that all my controllers can call - 它建议创建一个接口,实现和导入接口。

问题:

建议每次都创建一个界面吗?与仅使用一堆静态方法编写实现类相比,我获得了什么优势?

4 个答案:

答案 0 :(得分:1)

“Interface”与Java中的接口不同。这将是Objective-C中的一个协议。

接口部分使得使用它的任何人都知道类的公共部分。您可以在使用实用程序类的其他类中导入.h文件(包含接口),以使此类和方法知道调用者。

答案 1 :(得分:1)

根据我的理解,在Obj-C中,为所有类提供头文件和实现文件更为常见。但是,当所有方法都是静态util方法时,并不是完全必要的。实际上,您可以将所有实用程序方法放在一个类中 Util.m 然后将其包含在您需要访问它的方法

的每个文件中
#import "Util.m"

我可以看到拥有.h文件的一个优点是你可以控制变成公共的内容。 头文件中包含的任何方法签名都将变为公共。此外,与之前的回答一样,Obj-C中的接口与java完全不同。

答案 2 :(得分:0)

我来到C#世界,我多次搜索如何重现工厂模式。 @Interface这个关键词在开头就很混乱。

你可以声明这个。 指令OBJC_ROOT_CLASS禁止编译警告而没有NSObject遗产。您可以保留NSObject遗产,但您可以使用所有NSObject消息实现。当您压制NSObject时,您无法实例化您的实用程序类,只能将消息发送到静态方法。

MyClass.h

#import <Foundation/Foundation.h>

@protocol IMyClassProtocol

+ (void) methodOne;
+ (BOOL) methodWithReturn;

@end

OBJC_ROOT_CLASS
@interface MyClass <IMyClassProtocol>


@end

MyClass.m

#import "MyClass.h"
@implementation MyClass

+ (void) methodOne
{
}

+ (BOOL) methodWithReturn
{
    return YES;
}

@end

答案 3 :(得分:0)

如果您有常用函数,则可以将它们声明为函数。根本不需要生成@interface或类。例如,这是我项目中的常用功能:

# RNPaths.h
NSString *GetPathForDocument(NSString *fileName);

# RNPaths.m
NSString *GetPathForDocument(NSString *fileName) {
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = paths[0];
  return [documentsDirectory stringByAppendingPathComponent:fileName];
}

请注意,这不称为“实用程序”。它被称为“路径”,因为它包含计算路径的功能(“RN”只是我的前缀)。同样,我有一个RNColor文件(.h和.m),其函数如下:

UIColor *UIColorFromRGB(int rgbValue) {
  return [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]
}

这些是纯粹的功能。他们接受输入并给出输出,没有可变状态。没有理由围绕它们创建一个类(这会令人困惑)。

认为它们应该加上前缀是合理的,但我发现我的函数有点难以阅读(并且使用静态链接,它是安全的,这是我支持静态链接的一个原因,即使在Mac上也是如此)

现在,对于我的UIColorFromRGB(),您可能更愿意将其创建为UIColor上的类别,这也没关系。但是仍然没有理由为它创建一个新类。并且永远不会有理由将其称为“效用”。