2016-11-07 8 views
1

Q:Swift 3で関数引数として関数を渡すことはできますか?Swift 3で関数引数として関数を設定する方法

私のコードをリファクタリングするには、グローバル関数が必要です。この関数の最後には、action引数を持つカスタムボタンがあります。

let deleteButton = MIAlertController.Button(title: "cancel", 
              type: .cancel, 
              config: getDestructiveButtonConfig(), 
              action: { 
               print("completed") 
              }) 

私がしたいことは、関数を引数としてグローバル関数を設定するようなものです。同じクラス内で渡された関数でgetButton(..)によって呼び出され

MyGlobalStuff.swift 
... 
func getButton(_ myFunc: func, _ title: String) { 
    let deleteButton = MIAlertController.Button(title: title, 
              type: .cancel, 
              config: getDestructiveButtonConfig(), 
              action: { 
               myFunc // call here the function pass by argument 
              }) 
} 

MyViewController.swift 
... 
getButton(myPrintFunc, "cancel") 

func myPrintFunc() { 
     print("completed") 
} 

可能なことはありますか?ヘルプは非常に感謝しています。あなたがそうのようにそれらを渡すことができるように

+3

あなたはこのをお探しですか? https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.htmlの「関数型をパラメータ型として」 – Santosh

+0

@サントシーあなたのリンクは私の質問をカバーしていません。私は閉鎖または戻り値を探していません –

+0

。実際に私は閉鎖が必要でした...私は誓い、私は前にそれを試してみました。動作しませんでした。答えの後にもう一度試してみました。あなたやあなたの時間に感謝します –

答えて

7

を返却する必要があります他の関数のパラメータとして関数/クロージャを渡すことができます。

これは構文ここ

func doSomething(closure:() ->()) { 
    closure() 
} 

doSomethingをパラメータとしてなしのparamsと閉鎖、ノーリターンタイプを受け取る機能です。

あなたはあなたが行うことができます

typealias Func =() -> Void  

と仮定すると、この構文で

doSomething(closure: { _ in print("Hello world") }) 

または末尾の閉鎖構文を使用して

doSomething { 
    print("Hello world") 
} 
+0

ボタンが押された後ではなく、getButton関数が呼び出されたときにこのコードが呼び出されるため、クロージャが機能しない –

+2

@DavidSeek、getButton関数が呼び出された瞬間になぜ実行されるのですか? – user28434

+0

getButtonでクロージャがある場合、関数が完了した瞬間が呼び出されます。ボタンが押されたら呼び出す必要があります –

2

機能が迅速にファーストクラスです:

func getButton(_ myFunc:() -> Void, _ title: String) { 

あなたははい、あなたを、タイプに関数のシグネチャを指定すなわち、パラメータの種類とタイプ

+0

ありがとう、あなたのアプローチはappzYourLifeのようにうまくいった。彼は速かったので、彼にチェックマークを与えた。あなたの時間と助けのためにupvote。ありがとう –

4

をdoSomethingのを呼び出すことができます。

func getButton(_ title: String, _ myFunc: Func) { 
    let deleteButton = MIAlertController.Button(title: title, 
               type: .cancel, 
               config: getDestructiveButtonConfig(), 
               action: { 
                myFunc() 
               }) 
} 

あるいは:また

func getButton(_ title: String, _ myFunc: Func) { 
    let deleteButton = MIAlertController.Button(title: title, 
               type: .cancel, 
               config: getDestructiveButtonConfig(), 
               action: myFunc 
               ) 
} 

あなたが気づいていない場合、私は、パラメータリストの最後に閉鎖を移動しました。それはのような高度な魔法ができますこの方法:

getButton("X") { … } 

代わりの

getButton({ … }, "X") 
+0

と同じです。私はタイプアリアが好きです。ありがとうございました!それのためにupvote –

関連する問題