4

この質問は純粋な好奇心です。

Xcodeでは、なぜこれが機能するのですか:

if (view.class == [UITextView class]) {
    UITextView *tview = (UITextView *)view;
    tview.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

ただし、次のエラー メッセージが表示されますProperty 'textColor' not found on object of type 'UIView *'

if (view.class == [UITextView class]) {
    (UITextView *)view.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

直感的に、これらはまったく同じことを達成するはずです。

しかし、その後、括弧内のインラインキャストを囲む場合、それは正常に機能します。

if (view.class == [UITextView class]) {
    ((UITextView *)view).textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

C が操作の順序を処理する方法に関係していると思われますが、説明を聞きたいと思います。ありがとう!

4

2 に答える 2

6
if (view.class == [UITextView class]) {
    (UITextView *)view.textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

優先順位により、(UITextView*)will は の結果に対するキャストとして機能しますview.textColor。つまり、 にキャストされる前に最初の.textColor内でアクセスされます。UIView*UITextView*

if (view.class == [UITextView class]) {
    ((UITextView *)view).textColor = [UIColor colorWithRed:0.020 green:0.549 blue:0.961 alpha:1.];
}

この場合、余分な括弧は、式の残りの部分の前に部分式を最初に計算する必要があることをコンパイラーに通知します。そのため、これは にキャストviewされますUITextView*。その式の副作用はUITextView*インスタンスです。つまり、.textColorプロパティは、それが使用されているインスタンスで見つけることができます。

于 2012-10-26T21:15:01.633 に答える
0

私は自分のモデルで同じアプローチを使用しており、エンティティごとに型キャスト ヘルパー関数にまとめています。

// Cast an `entity` to a `user`.
TPUser *user(TPEntity *entity)
{ return ([entity isKindOfClass:[TPUser class]]) ? (TPUser*)entity : nil; }

だから、このように使用しても安全です...

someUI.text = user(entity).name;

...nilキャストが失敗したときに返されます。


この場合、次のようになります。

UITextField *textField(UIView *view)
{ return ([view isKindOfClass:[UITextField class]]) ? (UITextField*)view : nil; }
于 2014-01-22T18:59:55.833 に答える