如何将C结构化为类属性?

Spa*_*Dog 3 c cocoa-touch objective-c ios

我有这个:

typedef struct objTag{
    float x;
    float y;
    BOOL isUP;
} object;
Run Code Online (Sandbox Code Playgroud)

如何使对象成为这样的属性

@property (nonatomic, assign) object myObj;
Run Code Online (Sandbox Code Playgroud)

然后...

@synthesize myObj = _myObj;
Run Code Online (Sandbox Code Playgroud)

这个编译很好,但后来在代码中尝试类似的东西

self.myObj.isUP = YES;
Run Code Online (Sandbox Code Playgroud)

我收到消息"表达式不可分配"

Jar*_*ipe 6

这不起作用,因为编译器会将其编译为:

[[self getMyOj] setIsUP: YES];
Run Code Online (Sandbox Code Playgroud)

您会注意到'isUP'是C结构上的属性而不是Obj-C对象ivar.

编辑:

如果你真的想要直接操作,你需要像这样去做.

typedef struct s {
    int i;
} s;

@interface Test : NSObject {
    s *myS;
}
@property (nonatomic, assign) s *myS;
@end

@implementation Test
@synthesize myS;
- (id) init {
    self = [super init];
    myS = malloc(sizeof(s));
    myS->i = 0;
    return self;
}
@end


// somewhere later.
Test *t = [[Test alloc] init];
t.myS->i = 10;
Run Code Online (Sandbox Code Playgroud)

请注意,您需要在dealloc方法中清理myS.

  • 这实际上并不是正在发生的事情.如果仅仅是编译器无法判断isUp是属性还是结构元素,那么`((object)self.myObj).isUp = YES`就可以了.编译器抛出一个错误,因为`myObj`的属性访问器正在返回结构的副本,而不是对类所持有的结构的引用.编辑它不会改变类所持有的struct的值,因此编译器会抛出一个错误,让程序员知道该代码没有用例. (2认同)