在写代码的过程中,报“Expression is not assignable”,意思是表达式不可赋值,但是感觉自己的想法明明是没问题的,上代码看一下:

self.button.frame.size.height = frame.size.height;

把frame的height赋值给我的button的height,看上去逻辑是没有问题的,但是为什么会报错呢?

那就要提到用的点语法了,点语法一般有两个,get方法或者是set方法,就看是在赋值的左边还是右边(简单的情况可以这么看,复杂的不可以这么简单粗暴),显然粗略的看,self.button.frame.size.height是set方法,frame.size.height是get方法。

但是仔细思考,self.button.frame.size.height全部都是set方法吗?

显然不是,其中用到的set方法只有一个,那就是对于frame的set方法。

在这里查阅了一些资料,对于这个语句的点语法的判断大概是这样的:

self.button.frame中的frame可以看作是 [self.button setFrame],frame是一个结构体,之后的size.height则相当于调用C语言的方法。

self.button.frame.size.height = frame.size.height;

相当于给一个无返回值函数直接赋值,并且你还没有给这个函数进行传参,这是一种错误的语法。所以编译器告诉你"这个表达式无法被赋值"。

所以,解决办法就是,用OC中的点语法也就是get方法取这个结构体属性,用C的结构体点语法对这个属性中的字段进行修改,然后用OC中的点语法也就是set方法设置这个结构体属性。结构体是值传递,不是地址传递。需要将值计算完成之后,再赋值到对象frame中。

        CGRect tempFrame = frame;

        tempFrame.size.height = frame.size.height * 1.6;

        self.button.frame = tempFrame;

over!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐