私は、押されたボタンのタイトルが次のように返ってくることを理解しています。Swift 3.0では、どのボタンが押されたかを確認する方法
let myString = sender.title(for: .normal)!
しかし、私は本当にこれがなぜ機能するのか理解したいと思います。 Apple documentation for UIButtonで見つからなかった。
sender
はUIButtonではなくAny
のパラメータですが、この構文を解読するのに役立ちます。
私は、押されたボタンのタイトルが次のように返ってくることを理解しています。Swift 3.0では、どのボタンが押されたかを確認する方法
let myString = sender.title(for: .normal)!
しかし、私は本当にこれがなぜ機能するのか理解したいと思います。 Apple documentation for UIButtonで見つからなかった。
sender
はUIButtonではなくAny
のパラメータですが、この構文を解読するのに役立ちます。
メソッド名にsender
のタイプが表示されます。送信者は、次のように、UIButton
ある場合は掲載コードのみ動作します:
@IBAction func sampleMethod(_ sender: UIButton) {
let myString = sender.title(for: .normal)
}
sender
はタイプAny
のであれば、あなたはタイトルを同じようにアクセスするために、UIButton
としてそれをアンラップしなければなりません、ように:
@IBAction func sampleMethod(_ sender: Any) {
if let sender = sender as? UIButton {
let myString = sender.title(for: .normal)
}
}
これを行わないと、アプリケーションはコンパイルされません。タイプAny
にはtitle
というプロパティはありません。
は、あなたがそれを設定することができます:あなたがここに見ることができるよう
あなたがコードにストーリーボードからドラッグしてIBAction
機能を作成している場合は、デフォルトでは、送信者のタイプはAny
も持っていることです
ターゲット・アクチ:そうのように、タイプの横にドロップダウンメニューを使用してUIButton
のメカニズムについては、クラスのドキュメント(UIButton
など)から実行可能なコントロールを継承したクラスについて説明しています。
本質的に、アクション機能は、次のシグネチャのいずれかを実装する必要があります。
doSomething()
doSomething(_ sender: Any)
doSomething(_ sender: Any, event: UIEvent)
sender
パラメータがアクションを送信制御であろう。スウィフトで
Any
は、任意のタイプを表すことができ、特殊なタイプですが、それは実際の型ではないので、送信者がUIButton
であるならば、sender
はUIButton
のインスタンスになりますが、あなたはそれのいずれかが特定のアクセスができませんあなたがそれをダウンキャストしない限り、メソッドまたはプロパティ。一般的にあなたがあなたのコントロールおよびアクションハンドラを接続しているか知っているので、条件付きで意気消沈する必要はありません、しかし
func doSomething(_ sender: Any) {
if let button = sender as? UIButton {
let myString = button(for: .normal)
}
;:あなたのような何かを言うことができますあなたは、明示的なダウンキャストを使用することができます。
func doSomething(_ sender: Any) {
let button = sender as! UIButton
let myString = button(for: .normal)
}
それとも、もっと簡潔に:
今func doSomething(_ sender: UIButton) {
let myString = button(for: .normal)
}
、あなたが誤ってテキストフィールド上のアクションにdoSomething
を接続した場合、これらの最後の二つの形式があなた与えるだろうダウンキャストが失敗するとランタイムクラッシュが発生する。しかし、うまくいけばテスト中にこれをキャッチしているので、一般的に "安全"と考えられます。
guard let string = ((sender) as AnyObject).title(for: .normal)
else{
return
}
print(string)
また、これは動作します。
を(あなたが送信者の種類がわからない場合)でも、ボタンのための最も一般的な方法は、通常、このメソッドはシステムによって呼び出され
let string = (sender as! UIButton).title(for: .normal)
print(str!)
コンパイラは、 'AnyOnject'に対して' title(for:) 'を呼び出させません。 –
一度試してみてください。 –
で、ボタンのインスタンスがパラメータとして渡されます。そのため、このメソッドでは、ボタンを取得できます。 – jokeman