この型キャストの使用法は、ボタンのタップ アクションなどでよく出てきます。
UIButton *button = (UIButton *)sender;
私の質問は、明示的なキャスト "(UIButton *)" が必要な理由です。「送信者」の値を変数「ボタン」に割り当てても、UIButton へのポインターとして効果的にキャストされていませんか?
この型キャストの使用法は、ボタンのタップ アクションなどでよく出てきます。
UIButton *button = (UIButton *)sender;
私の質問は、明示的なキャスト "(UIButton *)" が必要な理由です。「送信者」の値を変数「ボタン」に割り当てても、UIButton へのポインターとして効果的にキャストされていませんか?
これは、自分が何をしているのかを知っていることをコンパイラに伝えsender
ますUIButon*
。
Stephen が言ったように、それは実際には必須ではありません。
しかし、それはスタイルと優れたビジネス慣行の問題です。
ところで、それを省略すると、エラーではなく警告が表示されます。警告を取り除くために、次のように簡単に実行できます。
someObject = (id) anotherObject;
これは、任意のクラスの任意のオブジェクトへの参照で機能します。実際に行われたキャストはほとんどないことがわかります。キャストなしで常にスーパークラスに割り当てることができます:
objectOfAClass = objectOfSubclassOfA;
要するに、そこで実際に何をしているのかについて非常に短い瞬間に考えるように強制することで、間違いを避けるのに役立ちます.
Objective-C では、次のようなアクション メソッドを記述するのが一般的です。
- (void)didAction:(id)sender
このメソッドは任意のオブジェクト (例: UIButton、UIControl など) から呼び出すことができ、送信者自身を設定することが期待されます。
Ever オブジェクトは ID です。したがって、そのメソッドには id 型の変数があります。ボタンであることが確実な場合は、UIButton にキャストできます。
別の方法として、メソッドが UIButton インスタンスによってのみ呼び出されることが確実な場合は、アクション メソッドを次のように変更できます。
- (void)didAction:(UIButton *)senderButton
そうすれば、キャストする必要はありません。
あなたが責任を負うその種のキャスティングについては、何も問題がないことに注意してください。よくわからない場合は、いつでもオブジェクトのクラスを確認できます
- (BOOL)isKindOfClass:(Class)aClass
方法。