Ios 如何正确地从类方法返回像CLLocationCoordinate2D这样的结构?
这个问题以Ios 如何正确地从类方法返回像CLLocationCoordinate2D这样的结构?,ios,objective-c,class,struct,return-value,Ios,Objective C,Class,Struct,Return Value,这个问题以CLLocationCoordinate2D为例,但这也适用于其他结构,例如CGPoint(尽管像这样的结构通常会自动包含在内) 我想在类方法中使用CLLocationCoordinate2D作为返回值。如果它是一个对象,您可以在顶部编写以下内容,只要.m文件引用了CoreLocation.h,就可以了 @class ClassName 有没有一种等效的方法可以告诉编译器不用担心结构,而不用重新声明它或将头文件导入类的头文件 我不想将CoreLocation.h导入头文件,因为这意味
CLLocationCoordinate2D
为例,但这也适用于其他结构,例如CGPoint(尽管像这样的结构通常会自动包含在内)
我想在类方法中使用CLLocationCoordinate2D
作为返回值。如果它是一个对象,您可以在顶部编写以下内容,只要.m文件引用了CoreLocation.h,就可以了
@class ClassName
有没有一种等效的方法可以告诉编译器不用担心结构,而不用重新声明它或将头文件导入类的头文件
我不想将CoreLocation.h导入头文件,因为这意味着导入该头文件的每个文件都将继承CoreLocation
谢谢我不完全明白您为什么不想导入CoreLocation,但是
CLLocationCoordinate2D
在CoreLocation.h
中声明。我不知道像@class for struct这样的方法,我认为它不存在,因为struct是C类型您可以创建自己的类来包装
CLLocationCoordinate2D
,或者从中返回NSValue,或者(为什么不?)一个字典。使用单个关键字没有简单的方法
在这里,你可以找到为什么它不是直接的,虽然有人说这是不可能做到的,有些真实,但不完全。
下面是解决方法
希望这会有所帮助。像其他类型一样返回结构。但是您应该知道,当返回结构时,您是在返回堆栈上的内部值的副本作为临时变量。与实际返回指针的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}
最简单的方法是只使用对象而不是
struct
,然后可以使用@class
关键字。在本例中,CLLocation
对象工作正常。或者,您可以经常使用NSDictionary
代替struct
,但对象更易于管理。这并不能回答问题。我想使用Apple的struct,而不是在我的代码中重新定义它。它确实回答了你的问题,并且解释了为什么你需要定义struct以及转发声明是不够的。只需在代码中使用任何结构,并包含包含相应定义的头(如所述)。如果我的头文件将在整个应用程序中使用,我不想将CoreLocation导入导入导入此头文件的每个文件中。标准做法是避免将头文件导入头文件。不管怎样,我最终还是改用了CLLocation*。Objective-C对象不是结构。它实际上是指向结构的指针。这不是对您最初的问题的一个恰当的回答,您希望C结构作为返回类型。是的,但它实现了同样的功能。当你可以只使用一个对象时,没有真正的理由强迫你自己去经历处理结构的所有麻烦。当然,这并不能解决这个问题,但是因为结构没有“@class”,所以如果可以的话,只使用@class就更简单了(通常在涉及到Objective C和iOS框架时,也可以使用@class)。“下面是这样做的解决方法”,这没有帮助。它是关于处理指向结构的指针,而不是结构本身。