2016-11-30 9 views
2

私はUIAlertAtionを作成しようとしており、ハンドラもあります。私はthis質問からの答えを読んで、それを行う方法を知っています。UIAlertActionのクロージャ引数を処理する方法

私の質問は、それの閉鎖部分についてです。

1)私は書くことができます知っている:{alert in println("Foo")}{_ in println("Foo")}けど{println("Foo")}を書き込むことはできません。コメントhereでは、のアクションアクションを処理する必要があるため説明しています。

これは、ハンドラがタイプ(UIAlertAction) -> Void)?であるため、渡されたalertActionを常にキャプチャする必要があることを意味しますか?


2) 私はまたthisを読み、答えは基本的に、あなたの引数として関数に渡すことができると言っているが、機能は私が書いた、タイプUIAlertAction -> Voidの何かを取る必要があります。

private func anything(action : UIAlertAction) { 
    print("hello") 
} 

、その後のような私のalertactionを書いた:なぜ私

let anotherAction = UIAlertAction(title: "hi", style: UIAlertActionStyle.Default, 
handler: anything(action)) // error: Use of unresolved identifier 'action' 

が混乱しかし、それに加えて、あなたは迅速にUIAlertActionStyle.Defaultを記述する必要はありません。コメントの中で )


3そのエラーを取得し、それはまた言いました。

'(title: String, (_) ->())' (aka '(title: String, _ ->())') is not convertible to '(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)?)' (aka '(title: Optional, style: UIAlertActionStyle, handler: Optional()>)'), tuples have a different number of elements


:.DEFAULTは、私はそれが.Default

let sendLogAction = UIAlertAction(title: "Log") { action in print("goodbye")} 

にデフォルト設定されるだろう。しかし、私は次のエラーを取得するように、スタイルを使用していない書き込みを試みたが、あまりにも

の作品4) また、this答えを読んでください。私はなぜ我々が渡す必要があるのか​​分からないalertそれは意味をなさない。アラートのタイプが何であるかわからないのではなく、タイプを定義していないのですか?誰かが行動そのものを渡すことが一般的に役立つと私たちが何をすることができるのかを説明できますか?


私はこれが4つの質問として書かれていることを知っていますが、それは本当に基本的な質問だと思います。私は広範囲にreadを持っています。私は働いていて、遊び場で遊んでいるプロジェクトでクロージャー/コンプリートハンドラーを使用しましたが、まだ混乱しています。

+0

#4は意味がありません。何を警告していますか? – rmaddy

+0

@rmaddy 'switch action.style' ...彼はアラートを切り替えていますが、彼はすでに定義していません:' style:.Default' – Honey

+0

彼は 'alert'を切り替えていません。彼は 'action.style'を切り替えています。いずれにしても、switch文は単なる例です。しかしそれは無意味です。あなたが設定したスタイルを既に知っているので、誰も実際のコードでそれを行うことはありません。 – rmaddy

答えて

3
  1. はい、常に引数を処理する必要があります。それは署名の一部であり、無視することはできません。これは最後のパラメータであり、クロージャパラメータであるため、handlerパラメータを削除できる特殊なSwift構文です。

  2. anything(action)からanythingに変更すると、リンク先の例のようになります。

  3. あなたは誤解しています。彼らはあなたがスタイルパラメータを落とすことができるということではありません。あなたはUIAlertActionStyleUIAlertActionStyle.Defaultから削除することができます。つまり、スタイルパラメータの引数として.Defaultを渡すだけです。

  4. ハンドラへのactionパラメータが役に立つ場所の例が必要です。本当にあまりにも多くの用途はありません。唯一のプロパティは、タイトル、スタイル、有効かどうかです。ハンドラが呼び出された場合、有効になっていることが分かっているため、後者は無意味です。唯一可能な使用方法は、タイトルまたはスタイルをハンドラで使用する必要があり、作成時に警告アクションにハードコードされていない場合です。ハンドラのタイトルまたはスタイルのプロパティにアクセスすると、アクションの作成時に使用された実際の値に簡単にアクセスできます。

+0

)1)後ろ閉じでのドロップ? 2)ああ!この例では私は上の行を見ませんでした。私は記憶のサイクルを避ける必要がある 'self.anything'を必要とするが、3)ハ! 4)。タイトルがサーバーから動的に来ていることを意味します。これは成功または失敗であり、クロージャの処理はタイトルに基づいて変更されますか? – Honey

+1

4)タイトルがハードコードされていないように、一連の動的ボタンがあるかもしれません。そして、ハンドラは、選択されたタイトルを他のメソッド呼び出しに渡す必要があります。これはほんの一例です。 – rmaddy

+0

自己と何かを参照する必要があります。私は財産のためにそれを行う必要性を理解していますが、私はそのことを機能のために行う必要性を理解していません。説明できますか? – Honey

1

1)UIAlerAction initメソッドの定義には3つの引数があり、最後の引数は(UIAlertAction - > Void)です。つまり、名前のない関数(別名クロージャ)または無し(オプションのシンボル?で指定)を持つことができます。あなたはとても

alert.addAction(UIAlertAction(title: "test", style: .default, handler: nil)) 

ようにすることができますクレートUIAlertController最後の引数を指定しないことを選択していますが、最後の引数(nilでない)を指定したい場合、あなたは、引数と戻りとしてUIAlertActionを取るクロージャーを提供する必要がある場合何もない(無効)。あなたのリンクを参照すると、彼は簡単にするために既に作成した '警告'定数を使用します。

「これは意味ですか...」と答えるには、3番目の引数の定義のために答えがYesです:(UIAlertAction) - > Void)?

2)引数(アクション)を渡すため、エラーが発生します。試してみてください

anotherAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, 
handler: anything) 

あなたはエラーが発生しません。

3)UIAlertActionは1つのinitメソッドしか持っていないので、3つの引数をすべて作成する必要があります。私の1)スタイルの答えを参照してください:.default。これはSwift Enumsを呼び出す新しい方法です。ちなみに、すべての列挙型は、あなたがへのリンクを持って答えからわかるように、ここで.Default`enterないコード

alert.addAction(UIAlertAction(title: String?, style: UIAlertActionStyle, handler: ((UIAlertAction) -> Void)) 

4).DEFAULT小文字そうである必要があります。定数の 'alert'(UIAlertAction)を使用すると、スタイルをチェックしたり、いくつかのことをするなど、あなたが望むことを何でもすることができます。

func anything(alert: UIAlertAction!) { 
    print("somehandler") 
    switch alert.title { 
    case "OK"?: 
     print("title is OK") 
    default: 
     print("title is not OK") 
    } 
    } 
+0

1)OK 2)私が書いたものと同じですが、それでも間違っています。 3)正しい4)あなたが何を意味しているのかわからない – Honey

+0

2)(私は(ハンドラの後に(アクション)を削除するのを忘れてしまった)新しいものを参照してください)そして4)何か機能する。 – Ohmy

+0

** constant ** 'action'はどういう意味ですか? – Honey

1

rmaddyの答えは十分ですが、OPいる:)私は私の質問の根本原因を見つける:

パラメータハンドラを理解する上で私の欠如は、ハンドラは型である:(UIAlertAction) -> Void)?すなわち閉鎖/機能

ハンドラは関数名を期待しているだけです。その関数を入力すると、その関数の入力にが入力されます。

は、ハンドラ、つまり関数名としてanythingとなります。

UIAlertActionの内部実装は、(それに渡される)actionが最終的anything(action)をやって注入し、タイプ(UIAlertAction) -> Void)?であるanythingを使用することになりhandler(action)のようないくつかのラインを持っています。

あなたのanything(input: UIAlertAction)は意味があると言われています。 (すでにrmaddyとのコメントで議論)


他のソリューションは、は、末尾の閉鎖でキャプチャアクションを使用して、あなたがそれをやって好きなよう代わりに機能を提供しますが、ではありません。

let retryAction = UIAlertAction(title: returnTitle(), style: UIAlertActionStyle.Default) { action in 
switch action.title { 
     case "OK": 
     okFunc() 
     case "cancel": 
     cancelFunc() 
     default: 
     defaultFunc() 
     } 
     } 

あなたは、コードを動的を取得している場合、このような切り替えは、そうでなければ、それは価値を知っているタイル用スイッチングなし付加価値がないだけで価値があります。

関連する問題