2011年11月29日火曜日

Xcode;Expression is no assignable


Xcode上でObjective-Cで式を書いていると、Expression is no assignableというエラーが出ることがある。ほとんどの場合の原因は、「構造体とクラスを混在した式を書いている」事にある。

「例」
UIImageViewのプロパティframeにアクセスする場合

    CGRect frame1=imageView.frame;        // OK
    CGSize size1 =imageView.frame.size;    // Expression is no assignable

frameはCGRect構造体を返してくる。
struct CGRect {
   CGPoint origin;  // frame.origin.x   frame.origin.y
   CGSize size;     // frame.size.width frame.size.height
};
なので、構造体のメンバーにアクセスするframe.sizeはCの式としては正しく見える。

ところが、Objective-CではimageView.frameはプロパティー式であり
    [imageView getFrame]
相当式なので、それに.sizeを付けても読み出せない。
従って、
    CGRect frame1=imageView.frame;    // OK;これはObjective-Cのプロパティー式
    CGSize size1 =frame1.size;    // OK;これはCの構造体メンバーにアクセスする式
としなければならない。

ここでは読み出し側を書いたが、書き込み側も全く同様。

Objective-C、特にUIKit上ではプロパティと構造体の命名規則に区別がないため非常にわかりにくい。
これはUIKit命名規則設計上の最大の失敗だと感じている。

Expression is no assignableが出たら、それがプロパティーなのか構造体のメンバーなのかを
確認した方が良い。

0 件のコメント:

コメントを投稿