參考文章: http://blog.csdn.net/like7xiaoben/article/details/8969093
self.view.frame.origin.x = x; // Expression is not assignable.
為什么編譯器會報這樣的錯?
self.view.frame是Objective-C中的點語法磷瘤,讀取了view的frame屬性翻翩,在Objective-C中使用點語法來訪問屬性是一種語法糖, self.view.frame語句會被轉(zhuǎn)換成:
[[self view] frame];
終究這還是消息的傳遞.
其中frame是一個CGRect結(jié)構(gòu), frame.origin.x 是C語言中的語法, 先訪問CGRect中的origin字段, 再訪問CGPoint中的x字段, 即
[[self view] frame].origin.x = x;
而Objective-C語言是對C語言的一個擴展墓臭,所以舔痪,上面的語句會被轉(zhuǎn)成C語言的函數(shù)調(diào)用形式登钥,類似于這種形式:
getFrame().origin.x = x;
在C語言中施符,函數(shù)的返回值是一個R-Value碍舍,是不能直接給它賦值的(所謂的R-Value脯厨,就是只能出現(xiàn)在等號的右邊璧微,你可以理解成是一個常量作箍;而可以被賦值的是L-Value,可以出現(xiàn)在等號的左邊前硫,通常是變量)胞得。因此,當(dāng)我們想要直接給函數(shù)的返回值賦值的時候屹电,編譯器告訴我們"這個表達式無法被賦值".
解決方案:
我們可以用一個臨時變量保存這個函數(shù)的返回值阶剑,修改這個臨時變量跃巡,然后再賦給frame:
CGRect frame = self.view.frame;
frame.origin.x = x;
self.view.frame = frame;