转: Xcode提示“expression is not assignable”

本文解析了在Objective-C中尝试直接修改CGRect结构返回值所导致的expressionisnotassignable编译错误,并提供了正确的修改CGRect结构成员变量的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

你的问题是:

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的编译器会变的智能一点,自动完成这种转换。

参: http://segmentfault.com/q/1010000000177216

`xcode-select: command not found` 错误通常发生在 macOS 开发环境中,可能是由于 Xcode 命令行工具未正确安装或配置所致。以下是针对该问题的全面解决方案: ### 1. 检查 Xcode 命令行工具是否已安装 运行以下命令来验证是否存在有效的开发者目录: ```bash xcode-select -p ``` 如果返回类似于 `/Library/Developer/CommandLineTools` 的路径,则说明命令行工具已安装;但如果报错 `xcode-select: error: invalid developer directory '/Library/Developer/CommandLineTools'`,则需要重新安装或修复它[^1]。 ### 2. 重新安装 Xcode 命令行工具 执行以下命令以触发 Xcode 命令行工具的重新安装过程: ```bash xcode-select --install ``` 系统会弹出一个对话框询问是否要安装开发者工具,点击“Install”按钮即可开始下载和安装。完成后重启终端再测试 `xcode-select -p` 是否正常工作[^1]。 ### 3. 手动指定正确的开发者路径 有时即使安装了 Xcode 或其命令行工具,仍可能出现路径不匹配的问题。可以手动设置开发者路径为实际存在的位置,例如: ```bash sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer ``` 这条命令将强制指向完整的 Xcode 应用程序而不是独立的 CommandLineTools 文件夹。 ### 4. 修改 Homebrew 安装脚本 (适用于特定情况) 对于某些特殊场景(如 M1 芯片设备),可能需要调整 Homebrew 的安装逻辑以便兼容新的存储结构。按照引用描述的方法操作如下: - 浏览器访问 [Homebrew Install Script](https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh),复制内容。 - 将所有提到 `/Library/Developer/CommandLineTools` 的地方替换成 `/Applications/Xcode.app/Contents/Developer`。 - 存储修改后的脚本到本地文件名为 `brew_install` 并赋予可执行权限: ```bash chmod +x brew_install ./brew_install ``` 此步骤确保 Homebrew 在初始化阶段能够正确定位资源[^1]。 ### 5. 处理 Python 环境冲突 当更新 macOS 后发现无法调用默认的 Python 解释器时,也可以尝试创建软链映射至现有的 Python 版本。例如: ```bash sudo ln -s $(which python3) /usr/local/bin/python sudo ln -s $(which python3) /Applications/Xcode.app/Contents/Developer/usr/bin/python ``` 以上指令帮助恢复全局范围内对 Python 的支持,同时满足 Xcode 内部需求[^4]。 --- ### 总结 通过上述方法应该可以彻底解决 `-bash: xcode-select: command not found` 的问题。关键是确认 Xcode 及其关联组件的状态,并适当干预它们的工作方式使之适应当前系统的独特条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值