【问题标题】:How do you return a struct like CLLocationCoordinate2D from a class method properly?如何从类方法中正确返回 CLLocationCoordinate2D 之类的结构?
【发布时间】:2013-07-18 05:20:20
【问题描述】:

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

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

@class ClassName

有没有一种等效的方法告诉编译器不用重新声明结构或将头文件导入类的头文件中不用担心结构?

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

谢谢

【问题讨论】:

    标签: ios objective-c class struct return-value


    【解决方案1】:

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

    【讨论】:

    • 如果我的头文件将在整个应用程序中使用,我不想将 CoreLocation 导入到导入此头文件的每个文件中。避免将标头导入头文件是标准做法。我最终还是改用了 CLLocation*。
    【解决方案2】:

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

    【讨论】:

    • Objective-C 对象不是结构。它实际上是一个指向结构的指针。这不是您希望 C 结构作为返回类型的原始问题的适当答案。
    • 是的,但它完成了同样的事情。当您可以只使用一个对象时,没有真正的理由强迫自己经历处理结构的所有麻烦。当然它不能解决问题,但是由于结构没有“@class”,所以如果可以的话,使用@class 会更简单(通常你可以在 Objective C 和 iOS 框架中使用)。跨度>
    【解决方案3】:

    您返回的结构与任何其他类型一样。但是您应该知道,当返回一个结构时,您将返回 stack 上的内部值的 copy 作为 temporary 变量。与实际返回 指针 的 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}
    

    【讨论】:

    • 这没有回答问题。我想使用 Apple 的 struct,而不是在我的代码中重新定义它。
    • 它确实回答了您的问题,并解释了您需要结构定义以及前向声明是不够的原因。只需在代码中使用任何结构并包含包含相应定义的标头(如解释)。你不会那样重新定义它。
    【解决方案4】:

    使用单个关键字没有直接的方法可以做到这一点。

    在这里你可以找到为什么它不直截了当,尽管有人说不可能做到这一点,这有点正确但并不完全。 Forward declare a struct in Objective-C

    这是执行此操作的解决方法 Forward declare structs in Objective C

    希望这会有所帮助。

    【讨论】:

    • “这是这样做的解决方法” 这没有帮助。它是关于处理指向结构的指针,而不是结构本身。
    猜你喜欢
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多