2017-07-28 45 views
1

私は、押されたボタンのタイトルが次のように返ってくることを理解しています。Swift 3.0では、どのボタンが押されたかを確認する方法

let myString = sender.title(for: .normal)! 

しかし、私は本当にこれがなぜ機能するのか理解したいと思います。 Apple documentation for UIButtonで見つからなかった。

senderはUIButtonではなくAnyのパラメータですが、この構文を解読するのに役立ちます。

+0

で、ボタンのインスタンスがパラメータとして渡されます。そのため、このメソッドでは、ボタンを取得できます。 – jokeman

答えて

3

メソッド名に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というプロパティはありません。

enter image description here

は、あなたがそれを設定することができます:あなたがここに見ることができるよう

あなたがコードにストーリーボードからドラッグしてIBAction機能を作成している場合は、デフォルトでは、送信者のタイプはAnyも持っていることです

enter image description here

1

ターゲット・アクチ:そうのように、タイプの横にドロップダウンメニューを使用してUIButtonのメカニズムについては、クラスのドキュメント(UIButtonなど)から実行可能なコントロールを継承したクラスについて説明しています。

本質的に、アクション機能は、次のシグネチャのいずれかを実装する必要があります。

  • doSomething()
  • doSomething(_ sender: Any)
  • doSomething(_ sender: Any, event: UIEvent)

senderパラメータがアクションを送信制御であろう。スウィフトで

Anyは、任意のタイプを表すことができ、特殊なタイプですが、それは実際の型ではないので、送信者がUIButtonであるならば、senderUIButtonのインスタンスになりますが、あなたはそれのいずれかが特定のアクセスができませんあなたがそれをダウンキャストしない限り、メソッドまたはプロパティ。一般的にあなたがあなたのコントロールおよびアクションハンドラを接続しているか知っているので、条件付きで意気消沈する必要はありません、しかし

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を接続した場合、これらの最後の二つの形式があなた与えるだろうダウンキャストが失敗するとランタイムクラッシュが発生する。しかし、うまくいけばテスト中にこれをキャッチしているので、一般的に "安全"と考えられます。

-1
guard let string = ((sender) as AnyObject).title(for: .normal) 
    else{ 
     return 
    } 
    print(string) 

また、これは動作します。

を(あなたが送信者の種類がわからない場合)でも、ボタンのための最も一般的な方法は、通常、このメソッドはシステムによって呼び出され

let string = (sender as! UIButton).title(for: .normal) 
print(str!) 
+0

コンパイラは、 'AnyOnject'に対して' title(for:) 'を呼び出させません。 –

+0

一度試してみてください。 –

関連する問題