當前位置:編程學習大全網 - 遊戲軟體 - Expression is not assignable分析

Expression is not assignable分析

當我們想要修改CGSize,CGRect中的某個參數時我們如果這樣寫:

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

編譯器會報錯: 'Expression is not assignable'

這是因為 self.view.frame 是Objective-C中的 點語法 , 點語法 本質就是 set與get方法 ,是讀取或者設置view的frame屬性,實際上這是消息傳遞。

而 frame 屬性是壹個 CGRect 結構,所以 frame.size.height 是C語言的語法,就是訪問CGRect結構中的size字段,同樣,height是CGSize結構的壹個字段, 這裏的點並不是點語法,而是C中結構體訪問字段的方式 。

我們知道,點語法在等號左側就是set方法,在右側就是get方法,是不夠精準的,例如 self.view1.view2.view3.frame ,在等號左側的時候,OC語法會把它轉換成 [[[[self getView1] getView2] getView3] setFrame] ,實際只有最後壹個OC的點語法代表了set方法。

self.view.frame 在等號的左側, frame 後面的 點 是C語法, view.frame 中的 點 是這個語句中最後壹個OC點語法,所以這個 點 代表 set方法 , self.view.frame 在等號的左側 ,OC 點語法會把它轉換成 [[self getView]setFrame:frame] 是壹個設值方法 參數是frame。這句話會被轉成C語言的函數調用形式,類似於這種形式: set_frame(frame) ,所以 self.view.frame 這個語句在等號左邊是壹個需要frame參數並且無返回值的函數。

在C語言裏, set_frame(frame).size.height = 10.f 給壹個無返回值函數直接賦值,並且妳還沒有給這個函數進行傳參,這是壹種錯誤的語法。所以編譯器告訴妳"這個表達式無法被賦值"。

解決辦法就是,用OC中的點語法也就是get方法取這個結構體屬性,用C的結構體點語法對這個屬性中的字段進行修改,然後用OC中的點語法也就是set方法設置這個結構體屬性

說白了 導致這個問題出現的原因就是 點語法的問題,有的點是OC語法 有的點是C語法。C語法是沒有問題的,問題在於OC是怎麽判斷點語法什麽時候是set方法,什麽時候是get方法。我們理所當然的認為了view.frame中的點是壹個get方法,實際在這裏OC把它當做了set方法。

  • 上一篇:我的團長我的團講的是什麽?
  • 下一篇:繪畫對孩子有什麽好處?
  • copyright 2024編程學習大全網