美文网首页
Expression is not assignable

Expression is not assignable

作者: 稻草田 | 来源:发表于2016-09-03 17:27 被阅读0次

参考文章: http://blog.csdn.net/like7xiaoben/article/details/8969093

self.view.frame.origin.x = x; // Expression is not assignable.

为什么编译器会报这样的错?
self.view.frame是Objective-C中的点语法,读取了view的frame属性,在Objective-C中使用点语法来访问属性是一种语法糖, self.view.frame语句会被转换成:

[[self view] frame];

终究这还是消息的传递.
其中frame是一个CGRect结构, frame.origin.x 是C语言中的语法, 先访问CGRect中的origin字段, 再访问CGPoint中的x字段, 即

[[self view] frame].origin.x = x;

而Objective-C语言是对C语言的一个扩展,所以,上面的语句会被转成C语言的函数调用形式,类似于这种形式:

getFrame().origin.x = x;

在C语言中,函数的返回值是一个R-Value,是不能直接给它赋值的(所谓的R-Value,就是只能出现在等号的右边,你可以理解成是一个常量;而可以被赋值的是L-Value,可以出现在等号的左边,通常是变量)。因此,当我们想要直接给函数的返回值赋值的时候,编译器告诉我们"这个表达式无法被赋值".
解决方案:
我们可以用一个临时变量保存这个函数的返回值,修改这个临时变量,然后再赋给frame:

CGRect frame = self.view.frame;
frame.origin.x = x;
self.view.frame = frame;

相关文章

网友评论

      本文标题:Expression is not assignable

      本文链接:https://www.haomeiwen.com/subject/qwokettx.html