3

这个问题CLLocationCoordinate2D用作示例,但这也适用于其他结构,例如 CGPoint(尽管通常会自动包含类似的结构)。

我想CLLocationCoordinate2D在类方法中用作返回值。如果它是一个对象,您可以在顶部编写以下内容,这很好,只要 .m 文件引用 CoreLocation.h

@class ClassName

是否有一种等效的方法可以告诉编译器不要担心结构而不重新声明它或将头文件导入到类的头文件中?

我不想将 CoreLocation.h 导入头文件,因为这意味着导入该头文件的每个文件都将继承 CoreLocation。

谢谢

4

4 回答 4

2

我不完全明白为什么您不想导入 CoreLocation,而是CLLocationCoordinate2DCoreLocation.h. 我不知道像@class for struct 这样的方法,而且我认为它不存在,因为 struct 是 C 类型。
您可以做的是创建自己的类,该类包装CLLocationCoordinate2D或从中返回 NSValue,或者(为什么不呢?)字典。

于 2013-07-18T05:44:58.477 回答
1

最简单的方法是只使用一个对象而不是struct,然后你可以使用@class关键字。在这种情况下,CLLocation对象工作得很好。或者,您通常可以使用NSDictionary代替struct,但对象更易于管理。

于 2013-07-18T16:46:11.633 回答
0

使用单个关键字没有直接的方法。

在这里你可以找到为什么它不直截了当,尽管有人说不可能做到这一点,有点正确但不完全。 在 Objective-C 中前向声明一个结构

这是 在Objective C中执行此前向声明结构的解决方法

希望这会有所帮助。

于 2013-07-18T05:46:29.957 回答
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}
于 2013-07-18T06:05:50.253 回答