2016-11-07 5 views
1

Q: Ist es möglich, eine Funktion als Funktionsargument in Swift 3 zu übergeben?Wie man eine Funktion als Funktionsargument in Swift setzt 3

Um meinen Code umzuformieren, möchte ich eine globale Funktion haben. Am Ende dieser Funktion befindet sich eine benutzerdefinierte Schaltfläche mit einem action Argument.

Was ich möchte, ist etwas wie, eine globale Funktion mit einer Funktion als Argument einrichten.

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 
              }) 
} 

von getButton(..) mit der übergebenen Funktion innerhalb der gleichen Klasse aufgerufen.

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

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

Ist so etwas möglich? Hilfe wird sehr geschätzt.

+3

Suchen Sie das? 'Funktionstypen als Parameter Typen' in https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Functions.html – Santosh

+0

@Santosh Ihr Link deckt meine Frage nicht ab. Ich bin nicht auf der Suche nach Abschluss oder Rückgabewerte –

+0

gut. Eigentlich brauchte ich eine Schließung ... Ich schwöre, ich habe es schon mal ausprobiert. funktioniert nicht. habe es nach den Antworten nochmal versucht, funktioniert ... mein schlechtes.danke dir oder deiner zeit –

Antwort

7

Sie Ja kann eine Funktion/Schließung als Parameter einer anderen Funktion übergeben.

Dies ist die Syntax

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

hier die Funktion doSomething erhält als Parameter einen Verschluss ohne params und ohne Rückgabetyp.

Sie können doSomething mit dieser Syntax nennen

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

Oder mit der hinteren Verschluss Syntax

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

Schließung funktioniert nicht, denn dann wird dieser Code aufgerufen werden, sobald die getButton-Funktion aufgerufen wurde, nicht einmal die Taste –

+2

@DavidSeek gedrückt, warum wird es ausgeführt werden, sobald die getButton-Funktion aufgerufen wurde? – user28434

+0

Wenn ich eine Schließung in getButton habe, wird es aufgerufen, sobald die Funktion abgeschlossen ist. aber ich brauche es angerufen zu werden, sobald die Taste gedrückt wurde –

2

Funktionen sind erste Klasse in schnellen, damit Sie sie wie so passieren kann:

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

Sie müssen angeben, die Signatur der Funktion in der Art, dh Parametertypen und Rückgabetyp

+0

danke, dein ansatz funktionierte genauso gut wie appzYourLife's. gab ihm das Häkchen, weil er schneller war. Upvote für Ihre Zeit und Hilfe. Danke –

4

Unter der Annahme,

typealias Func =() -> Void  

Sie tun können:

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

Oder auch:

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

Auch wenn Sie nicht bemerkt haben, zog ich bis zum Ende der Parameterliste Schließung. Auf diese Weise es erweiterte Magie erlaubt wie:

getButton("X") { … } 

statt

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

uh. Ich mag die Typalien. Danke! Upvote dafür –

Verwandte Themen