iOS:将struct作为参数传递

时间:2014-02-25 11:01:55

标签: ios objective-c struct import include

我在A类的 .m 文件中声明了一个结构:

typedef struct myStruct
{
    size_t count;
} myStruct;

我试图将它作为参数传递给另一个类(B类)中的方法,其中我#import类A的 .h 文件(即{{1} }):

#import "myClassA.h"

当我这样做时,我分别得到了这些错误:

- (void)myMethodWithStructInClassB:(myStruct)aStruct
{

}
  

类型struct aStruct的声明在此之外是不可见的   功能

- (void)myMethodWithStructInClassB:(struct myStruct*)aStruct 
  

变量的类型不完整myStruct aStruct

然后我尝试使用- (void)myMethodWithStructInClassB:(struct myStruct)aStruct 代替,仍然存在错误。

顺便提一下 ,使用Objective-C中的#include#include会有什么不同?我做了一些研究,虽然它们是答案,但它们对我的案例没有帮助。有人说#import我们防止双重包括标题,但是在回答者之间没有解决争论。

我成功解决了问题:#import(不是 .h )。

有人可以向我解释上面的(a)错误和(b)使用#import "myClassA.m"#include之间的差异在Objective-C和(c)为什么导入 .m 为我做了诀窍?

另外,当在Objective-C中传递struct作为参数时,这将是正确的方法吗?即#import#import

2 个答案:

答案 0 :(得分:3)

#include和#import之间的区别在于#import总是确保文件只导入一次。

您遇到的错误是因为您在.m文件中实现了一个使其成为私有的结构,您不会将其暴露给其他类。如果要在不同的类中使用它,则应将其移动到.h文件。

另一个问题是这个宣言:

- (void)myMethodWithStructInClassB:(struct myStruct*)aStruct

如果你想要一个指向struct的指针,但我相信你只想把它作为参数传递,那就试试吧了:

- (void)myMethodWithStructInClassB:(myStruct)aStruct 

答案 1 :(得分:1)

  • 您在.m文件中声明了结构,但是您要导入.h文件。 通常,您想要的是在.h文件中声明结构,并将其导入到第二个类。不要导入.m文件! .m表示iMplementation(不确定m是否真的源于此)并且意味着,这些东西只在那里实现,但是在大多数时间都在elswhere中声明。 “.h”是接口文件,并且如名称所示,给出类的接口。因此,该类想要公开声明的任何符号,您应该放在.h文件中。

  • #include只是将所有文件的内容复制到放置#include语句的位置。正如你所说,#import更加智能,因为它只为整个二进制文件导入一次代码。因此,通常,在使用Obj-C时始终使用#import

myClassA.h

typedef struct
{
   size_t count;
} myStruct;

myClassB.h

#import "myClassA.h"

- (void)myMethodWithStructInClassB:(myStruct)aStruct
{
   aStruct.count = 42;
}
相关问题