我正在为MKPolygon类创建一个类别。您可以找到对此课程here的引用。我有两个公共类方法,我想做“公开”和一些“私人”方法来处理一些内部。我想这样做的原因是因为,正如你所看到的,这个类可用的方法是类方法,我想继续通过提供将返回的类方法(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方法,所以我不确定为什么我会收到此警告。这里有什么东西我做错了,如果有的话,一般情况下,我是否已经准备好了我想做的一切?显然,我的私有方法也必须是类方法,因为你不能从类方法中调用实例方法。
感谢此处的任何意见/建议/更正。
答案 0 :(得分:1)
如果calculateStuff
是一个仅在实现块中使用的私有方法
在MKPolygon (MKPolygonStuff)
类别中,您根本不需要在接口中声明该方法。
从“MKPolygon + MKPolygonStuff.m”中删除@interface MKPolygon() ... @end
。
使用当前的Xcode / clang版本,您甚至无需转发声明在实现块中定义和使用的方法。