3

我正在为 MKPolygon 类创建一个类别。您可以在此处找到对此类的参考。我有两个要“公开”的公共类方法和一些“私有”方法来处理一些内部。我想这样做的原因是,如您所见,该类可用的方法是类方法,我想通过提供将返回的类方法(MKPolygon *)继续与此保持一致。此外,我将编写大量工作,而不分解任务将违背良好的编码实践,当然也难以测试和阅读——这尤其重要,因为我将把它贡献给 github。

这是我在 XCode 中创建新类别时创建的头文件和实现文件。我现在要使这些方法通用,以表达我的观点:

MKPolygon+MKPolygonStuff.h

#import <MapKit/MapKit.h>

@interface MKPolygon (MKPolygonStuff){

}
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map;
+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2;

@end

MKPolygon+MKPolygonStuff.m

@interface MKPolygon(){


}

+(void)calculateStuff;

@end

@implementation MKPolygon (MKPolygonStuff)

+(void)calculateStuff{



}
+(MKPolygon *)polygon:(MKPolygon *)poly1 doStuff:(MKPolygon *)poly2 onMap:(MKMapView *)map{

  //do stuff and call other class methods to break up tasks
  //[self calculateStuff];

 }

+(BOOL)polygon:(MKPolygon *)poly1 doesThisThing:(MKPolygon *)poly2{

    //returns boolean
    //possibly call other class methods do some internals.
}

在我的实现文件中,我的界面在括号内有一些东西,但它给了我以下警告:

“界面上的类别重复定义......”

因此,我决定在这里阅读有关此问题的其他几个线程后,将括号留空。这样做也可以让我拥有我最肯定需要的、我不想被“公开”的实例变量。

现在我有一个警告,它位于 +(void)calculateStuff 旁边的实现部分下。

“类别正在实现一种方法,该方法也将由其主要类实现”。

我在网上搜索了这个警告,看看是什么导致了这个警告,如果编译器认识到你将覆盖类的一些内置功能,你似乎会收到这个警告。问题是,MKPolygon 类中没有 calculateStuff 方法,所以我不确定为什么会收到此警告。这里有什么我做错了,如果有的话,一般来说,我是否在这里设置了我想做的所有事情?显然,我的私有方法也必须是类方法,因为您不能从类方法中调用实例方法。

在此不胜感激任何评论/建议/更正。

4

1 回答 1

1

如果calculateStuff是仅在MKPolygon (MKPolygonStuff)类别的实现块中使用的私有方法,那么您根本不需要在接口中声明该方法。

只需@interface MKPolygon() ... @end从“MKPolygon+MKPolygonStuff.m”中删除。

使用当前的 Xcode/clang 版本,您甚至不需要前向声明在实现块中定义和使用的方法。

于 2013-06-02T21:09:18.193 回答