問題:
self.view.frame.size.height = 100f;
這樣寫沒法通過編譯永票,編譯器會(huì)報(bào)錯(cuò)"expression is not assignable"
原因是卵贱,這句話里面的幾個(gè)點(diǎn)有兩種不同的含義。self.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 = 100f;
而Objective-C只是對(duì)C語言的一個(gè)擴(kuò)展镐牺,所以,上面這句話會(huì)被轉(zhuǎn)成C語言的函數(shù)調(diào)用形式魁莉,類似于這種形式:
getframe().size.height = 100f;
getter里并不能賦值睬涧,因此,當(dāng)你打算直接給函數(shù)的返回值賦值的時(shí)候旗唁,編譯器告訴你"這個(gè)表達(dá)式無法被賦值"畦浓。這就是這個(gè)錯(cuò)誤的出現(xiàn)原因。
處理方案:
所以检疫,解決辦法就是讶请,用一個(gè)臨時(shí)變量保存這個(gè)函數(shù)的返回值,修改這個(gè)臨時(shí)變量屎媳,然后再賦給frame:
// 1. 用一個(gè)臨時(shí)變量保存返回值夺溢。
CGRect temp = self.view.frame;
// 2. 給這個(gè)變量賦值。因?yàn)樽兞慷际荓-Value烛谊,可以被賦值
temp.size.height = 100f;
// 3. 修改frame的值
self.view.frame = temp;
我知道這樣寫看起來有點(diǎn)笨风响,也許有一天,Objective-C的編譯器會(huì)變的智能一點(diǎn)丹禀,自動(dòng)完成這種轉(zhuǎn)換钞诡。