以下の 2 つのステートメントの違いは何ですか?
UILabel *mainLabel = (id) [cell viewWithTag:10];
と
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
以下の 2 つのステートメントの違いは何ですか?
UILabel *mainLabel = (id) [cell viewWithTag:10];
と
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
簡単な答え: なし。
どちらのキャストも、ポインター型の非互換性に関するコンパイラーの警告を防ぐ効果があります。
いずれにせよ、Objective-C の型は実行時にチェックされないため、実行してもほとんど違いはありません。
実際のところ
UILabel *mainLabel = (id) [cell viewWithTag:10];
UILabel *mainLabel = (UILabel*) [cell viewWithTag:10];
UILabel *mainLabel = [cell viewWithTag:10];
実行時に完全に同等です。
唯一の顕著な違いは、3 番目のケースでは型に互換性がないように見えるため、コンパイラが警告を表示することです。実際、 Liskov 置換原則により、ジェネリックUIView
を に割り当てることはできませんUILabel
。それをキャストすることで、コンパイラに次のように伝えます。
ただし、この観点からは、キャストすることid
は実際には意味がありません。型をより一般的なものにしていますが、適切なサブクラスに絞り込む必要があります。
まとめとして、期待どおりのクラスに戻り値の型をキャストすることをお勧めします。それはより理にかなっており、コードの可読性も向上します。