Xcode提示“expression is not assignable” self.view.frame.size.height = 100f无法赋值
2015-09-02 16:00
302 查看
self.view.frame.size.height = 100f;
这样写没法通过编译,编译器会报错"expression is not assignable"
原因是,这句话里面的几个点有两种不同的含义。
self.view.frame是Objective-C语法,是读取view属性的frame属性,在Objective-C中使用点来访问属性只是一种语法糖,所以
self.view.frame这句话会被转换成:
[[self view] frame]
也就是说,实际上这是消息传递。
而frame属性是一个CGRect结构,所以
frame.size.height是C语言的语法,就是访问CGRect结构中的size字段,同样,height是CGSize结构的一个字段。所以,你这句话实际上等于:
[[self view] frame].size.height = 100f;
而Objective-C只是对C语言的一个扩展,所以,上面这句话会被转成C语言的函数调用形式,类似于这种形式:
getframe().size.height = 100f;
而在C语言里,函数的返回值是一个R-Value,是不能直接给它赋值的(所谓的R-Value,就是只能出现在等号的右边,你可以理解成是一个常量;而可以被赋值的是L-Value,可以出现在等号的左边,通常是变量)。因此,当你打算直接给函数的返回值赋值的时候,编译器告诉你"这个表达式无法被赋值"。这就是这个错误的出现原因。
所以,解决办法就是,用一个临时变量保存这个函数的返回值,修改这个临时变量,然后再赋给frame:
// 1. 用一个临时变量保存返回值。 CGRect temp = self.view.frame; // 2. 给这个变量赋值。因为变量都是L-Value,可以被赋值 temp.size.height = 100f; // 3. 修改frame的值 self.view.frame = temp;
我知道这样写看起来有点笨,也许有一天,Objective-C的编译器会变的智能一点,自动完成这种转换。
相关文章推荐
- GIT分支管理是一门艺术
- [leetcode 17]Letter Combinations of a Phone Number
- 由xib生成UIView的问题
- 数据库索引及基本优化入门
- Day02--笔记
- log4j2 与 spring mvc整合
- POJ 1125 Stockbroker Grapevine
- Ruby Rails在windows下开发环境的搭建
- HDU 4749-Parade Show(KMP变形)
- 关于处理字符串编码:escape、encodeURI、encodeURICompone
- Storm: monitor storm with supervisor
- 学习笔记 SQLite数据库应用
- 拷贝文件中有01.这样的行符号为新的文件
- MVC 上传下载
- 后缀数组 - poj3294 Life Forms
- 采用Tokyo Cabinet的一些问题
- 如何检索Android设备的唯一ID
- Google I/O 2015 为 Android 开发者带来了哪些福利?
- Build Your Programming Technical Skills
- Windows下mysql忘记root密码的解决方法