Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何正确地从类方法返回像CLLocationCoordinate2D这样的结构?_Ios_Objective C_Class_Struct_Return Value - Fatal编程技术网

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)。“下面是这样做的解决方法”,这没有帮助。它是关于处理指向结构的指针,而不是结构本身。