此问题使用CLLocationCoordinate2D
作为示例,但这也适用于其他结构,例如CGPoint(尽管通常会自动包含这些结构)。
我想在类方法中使用CLLocationCoordinate2D
作为返回值。如果它是一个对象,你可以在顶部写下面的内容,只要.m文件引用了CoreLocation.h就可以了。
@class ClassName
是否有一种等效的方法告诉编译器在不重新声明结构或将头文件导入类的头文件中时不要担心结构?
我不想将CoreLocation.h导入头文件,因为这意味着导入该头文件的每个文件都将继承CoreLocation。
由于
答案 0 :(得分:2)
我并不完全明白为什么你不想导入CoreLocation,但在CLLocationCoordinate2D
中声明了CoreLocation.h
。我不知道像@class这样的方法,因为struct是C类型,所以我认为它不存在。
你可以做的是创建自己的类来包装CLLocationCoordinate2D
或从中返回NSValue,或者(为什么不呢?)一个字典。
答案 1 :(得分:1)
最简单的方法是使用对象而不是struct
,然后您可以使用@class
关键字。在这种情况下,CLLocation
对象可以正常工作。或者,您通常可以使用NSDictionary
代替struct
,但对象更容易管理。
答案 2 :(得分:0)
使用单个关键字没有直接的方法。
在这里你可以找到为什么它不简单,虽然它说不可能做到这一点,但有些真实但不完全。 Forward declare a struct in Objective-C
这是解决这个问题的方法 Forward declare structs in Objective C
希望这会有所帮助。
答案 3 :(得分:0)
您返回任何其他类型的结构。但是您应该知道,在返回结构时,您将返回堆栈上的内部值的副本作为临时变量。与您实际返回指针的Objective-C对象不同。
您返回的类型必须是完整类型。这意味着,在您的方法声明中,您需要结构的定义。在您的情况下,这意味着您需要包含标题。
例如:
typedef struct MyStruct {
int a;
int b;
} MyStruct;
@interface MyClass : NSObject
+(MyStruct) theStruct;
@end
@implementation MyClass
+(MyStruct) theStruct {
MyStruct s = {.a = 1, .b = 2};
return s;
}
@end
int main(int argc, const char * argv[])
{
@autoreleasepool {
MyStruct s1 = [MyClass theStruct];
s1.a = 100;
s1.b = 100;
NSLog(@"s1 = {%d, %d}", s1.a, s1.b);
NSLog(@"MyStruct.theStruct = {%d, %d}", [MyClass theStruct].a, [MyClass theStruct].b);
[MyClass theStruct].a = 0; // has no effect!
}
return 0;
}
打印:
s1 = {100, 100}
MyStruct.theStruct = {1, 2}