iOS開發(fā)初級(jí)錯(cuò)誤 Expression is not assignable

當(dāng)我們想要修改CGSize,CGRect中的某個(gè)參數(shù)時(shí)我們會(huì)這樣寫:self.view.frame.size.height = 10.f;

編譯器會(huì)報(bào)錯(cuò):'Expression is not assignable'

這是因?yàn)閟elf.view.frame是Objective-C語法,是讀取view屬性的frame屬性,在Objective-C中使用點(diǎn)來訪問屬性只是一種語法糖,所以self.view.frame這句話會(huì)被轉(zhuǎn)換成:[[self view] frame]

也就是說,實(shí)際上這是消息傳遞。

而frame屬性是一個(gè)CGRect結(jié)構(gòu),所以frame.size.height是C語言的語法,就是訪問CGRect結(jié)構(gòu)中的size字段,同樣,height是CGSize結(jié)構(gòu)的一個(gè)字段。所以,你這句話實(shí)際上等于:

[[self view] frame].size.height = 10.f;

而Objective-C只是對C語言的一個(gè)擴(kuò)展,所以,上面這句話會(huì)被轉(zhuǎn)成C語言的函數(shù)調(diào)用形式,類似于這種形式:

getframe().size.height = 10.f;

而在C語言里,函數(shù)的返回值是一個(gè)R-Value,是不能直接給它賦值的(所謂的R-Value,就是只能出現(xiàn)在等號(hào)的右邊,你可以理解成是一個(gè)常量;而可以被賦值的是L-Value,可以出現(xiàn)在等號(hào)的左邊,通常是變量)。因此,當(dāng)你打算直接給函數(shù)的返回值賦值的時(shí)候,編譯器告訴你"這個(gè)表達(dá)式無法被賦值"。這就是這個(gè)錯(cuò)誤的出現(xiàn)原因。

所以,解決辦法就是,用一個(gè)臨時(shí)變量保存這個(gè)函數(shù)的返回值,修改這個(gè)臨時(shí)變量,然后再賦給frame:

// 1. 用一個(gè)臨時(shí)變量保存返回值。

CGRect tempRect = self.view.frame;

// 2. 給這個(gè)變量賦值。因?yàn)樽兞慷际荓-Value,可以被賦值

tempRect.size.height = 10.f;

// 3. 修改frame的值

self.view.frame = tempRect;

附:上文中提到一個(gè)名詞(語法糖),對于初學(xué)者來說可能不知道這個(gè)詞的意思,其實(shí)語法糖就是一種便捷的寫法,編譯器會(huì)幫我們做轉(zhuǎn)換,執(zhí)行相關(guān)代碼,語法糖可以提高開發(fā)編碼的效率,但是人為疏失可能產(chǎn)生錯(cuò)誤的語法。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容