欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Objective-C之报错:Expression is not assignable.

程序员文章站 2022-07-14 21:33:24
...

最近开始着手计划在学习原生语言 Objective-C,一路上遇到的坑,我也会一一记录下来,都是一些踩坑的经验。因为总有那么一天,会有人因为看到我写的某篇技术博客,而受益良多。会更加激励自己不断前进。

在学习一个UIButton中附上背景图后,点击按钮移动位置的这个小demo中,代码附上:

- (IBAction)leftBtn {
    CGRect originFrame = self.img.frame;
    originFrame.origin.x -=10;
    self.img.frame = originFrame;
    
    NSLog(@"左");
}

比方这个向左的点击事件。首先拿到这个UIButton的img的frame。而这个frame是结构体CGRect类型,所以需要用CGReact 变量名存一下。然后进行origin(x/y)或者size(width/height)的变化。最后竟然还需要加一步:self.img.frame = originFrame.再赋值回去。

真的要是以我之前js的弱类型写法,就会直接写成:

self.img.frame.origin.x -=10; 

就会报错了,重点来了:

Objective-C之报错:Expression is not assignable.

然而OC并不是这样,因为我们这个UIButton是OC对象;而当OC对象中的属性frame是结构体类型,修改结构体类型属性frame的时候,必须要先用结构体类型CGRect存储后,再进行赋值表达式计算;然后要再将计算好了的值重新赋值给self.img.frame. 

 结构体是值传递,不是地址传递。需要将值计算完成之后,再赋值到原来的对象frame中。