self.view.frame.size.height = 100f; 这样写没法通过编译,编译器会报错"expression is not assignable"


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;

时间: 2024-10-27 02:54:27

self.view.frame.size.height = 100f; 这样写没法通过编译,编译器会报错"expression is not assignable"的相关文章

OC中 self.view.frame.size.height = 100; 不能通过编译的原因

在OC中,当需要修改一个view的尺寸时,通常是通过先将 self.view.fram赋值给一个临时变量,然后修改临时变量,最后将临时变量赋值给 self.view.frame.代码如下: 1 // 1. 用一个临时变量保存返回值. 2 CGRect temp = self.view.frame; 3 4 // 2. 给这个变量赋值.因为变量都是L-Value,可以被赋值 5 temp.size.height = 100f; 6 7 // 3. 修改frame的值 8 self.view.fra

Qt打开外部程序和文件夹需要注意的细节(Qt调用VC写的动态库,VC需要用C的方式输出函数,否则MinGW32编译过程会报错)

下午写程序中遇到几个小细节,需要在这里记录一下. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 QProcess *process = new QProcess(this);     QFileInfo fileinfo(appUrl);     QString appPath = QApplication::applicationDirPath()+SAVEDIR+"/"+fileinfo.fileName();     bool res = proce

Jsoncpp写“鱘”的json数据,报错。

最近在用Json::FastWriter生成json数据时,发现一个问题.含有"鱘"字的json字段会多出一个斜杠,不知道是不是编码的问题. C++要使用JSON来解析数据,一般采用jsoncpp. 网站:http://sourceforge.net/projects/jsoncpp/ 经过json校验http://jsonlint.com/,报错 很是郁闷.现在只能从生成的字符串想办法了. 遍历生成的字符串,删除"\". 生成json数据成功! Jsoncpp写&

<c:choose>标签内出错。不能写注解,否则就会报错

org.apache.jasper.JasperException: Validation error messages from TagLibraryValidator for c in /WEB-INF/views/modules/fdzapp/combineCostList_Wf.jsp 113: Illegal text inside "c:choose" tag: "<!-- 状态...". at org.apache.jasper.compiler

C#复习笔记(4)--C#3:革新写代码的方式(用智能的编译器来防错)

用智能的编译器来防错 本章的主要内容: 自动实现的属性:编写由字段直接支持的简单属性, 不再显得臃肿不堪: 隐式类型的局部变量:根据初始值推断类型,简化局部变量的声明: 对象和集合初始化程序:用一个表达式就能创建和初始化对象: 隐式类型的数组:根据内容推断数组的类型,从而简化数组的创建过程: 匿名类型:允许创建新的临时类型来包含简单的属性: 自动实现的属性 这个特性简单的我都不想描述,但是为了保持内容的完整性,放一张图: 和匿名方法还有迭代器一样,它在编译器的帮助下会生成一个后备字段. 自动实现

FFMPEG more samples than frame size (avcodec_encode_audio2) 的解决方案

在实际的项目中,从音频设备采集到的音频的类型和编码器类型(aac ,amr)通常是不一致的. 那么我们首先需要做重采样的过程.利用swr_convert 重新采样. 这时候我们可能会遇到另外一个问题.就是在encode_audio的时候遇到 more samples than frame size (avcodec_encode_audio2)  的问题. 问题的原因在于 我们编码器的frame_size 比采集到的fram->nb_samples小 [cpp] view plaincopy /

[UIScreen mainScreen].bounds.size.height获取的数值不变的问题解决

一.问题 [UIScreen mainScreen].bounds.size.height获取的数值永远是固定的,不会根据不同屏幕尺寸的苹果手机而改变 二.原因 这是因为,苹果系统在监测到[email protected]这个后,才会调用屏幕尺寸函数. 因此,搞ios开发,一定要加上这张图片才行. 版权声明:本文为博主原创文章,未经博主允许不得转载.

OpenCV报错size.width&gt;0 &amp;&amp; size.height&gt;0 in function

(1)错误代码 import cv2 as cv src = cv.imread("D:\images\我喜欢的发型\07.PNG") cv.namedWindow("Hello", cv.WINDOW_AUTOSIZE) cv.imshow("Hello", src) cv.waitKey(0) cv.destoryAllWindows() (2)错误描述 D:\DevKits\Anaconda3\python.exe D:/workspace

line 352 Error: Assertion failed (size.width&gt;0 &amp;&amp; size.height&gt;0) in cv::imshow

OpenCV 使用 createtrackerbar()报错问题 Error Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file c:\build\master_winpack-build-win64-vc15\opencv\modules\highgui\src\window.cpp, line 352 原因 先上图把 这个问题困扰我几个小时,其实是因为多次imshow一张图造