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

来源:互联网 发布:软件技能有哪些 编辑:程序博客网 时间:2024/06/06 03:20

今天在一个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;


0 0
原创粉丝点击