您的位置:首页 > 移动开发 > Objective-C

关于Objective-C 错误代码 Expression is not assignable 引发的问题

2015-12-21 19:31 651 查看
今天在一个OC代码练习中我遇到了 Expression is not assignable 这个问题,起因是这样的

我先是创建了一个Person 类,然后在类中定义了一个Studen 结构体,然后利用这个结构体定义一个 Bob 变量,.h文件的内容如下

#import <Foundation/Foundation.h>

typedef struct
{
int age;
int number;
}Student;

@interface Person : NSObject
{
@public
Student Bob;
}

@property (nonatomic, assign) Student Bob;

@end


然后我在main 函数里面创建了一个Person 的对象p1 ,我想利用p1 对其内置的Bob.age 属性赋值,很自然的我想到了这种方法

p1.Bob.age = 14;

结果刚写完就出现了这个



看来这样是行不通的了,于是百度错误关键字 Expression is not assignable

貌似找到了原因

p1.Bob 与Bob.age 中的两个点的含义是不同的,第一个点是OC中的点语法,第二个点是C语言中的语法,

而且由于OC只是C语言的一个扩展,所以上面的错误代码会被转成C语言的函数调用形式,类似于这样

getBob().age = 14;


然后我引用我看到的文章的原话

而在C语言里,函数的返回值是一个R-Value,是不能直接给它赋值的(所谓的R-Value,就是只能出现在等号的右边,你可以理解成是一个常量;而可以被赋值的是L-Value,可以出现在等号的左边,通常是变量)。因此,当你打算直接给函数的返回值赋值的时候,编译器告诉你"这个表达式无法被赋值"。这就是这个错误的出现原因。

看来原因就是出现在这里了,接下来就是解决办法了

我总结了有几个解决办法

1.在main 函数里面新建一个结构体变量然后对p1.Bob 进行等价赋值,具体代码如下

Person *p1 = [[Person alloc] init];
Student subBob;
p1.Bob = subBob;
subBob.age = 14;


这样对subBob 的age 赋值其实就是对p1.Bob的age 赋值了

2.将前面的点换成 ->

直接将前面的点换掉肯定是不行的,要在.h 文件里面先声明成员变量,而且因为涉及到作用域的问题,要把成员变量的作用域设置为@public

@interface Person : NSObject
{
@public
Student Bob;
}


之后在main 函数里面就可以这样用了

p1->Bob.age = 14;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: