2015-11-15 12 views
14

Ich habe die folgende Funktion arbeiten, wie ich erwarte, in iOS 8:Funktionen als Parameter in Swift Passing

func showConfirmBox(msg:String, title:String, 
    firstBtnStr:String, 
    secondBtnStr:String, 
    caller:UIViewController) { 
     let userPopUp = UIAlertController(title:title, 
      message:msg, preferredStyle:UIAlertControllerStyle.Alert) 
     userPopUp.addAction(UIAlertAction(title:firstBtnStr, style:UIAlertActionStyle.Default, 
      handler:{action in})) 
     userPopUp.addAction(UIAlertAction(title:secondBtnStr, style:UIAlertActionStyle.Default, 
      handler:{action in})) 
     caller.presentViewController(userPopUp, animated: true, completion: nil) 
} 

Ich mag so etwas wie die folgenden machen, um als Argument zu sein, die Methoden zu übergeben wenn der eine oder andere der Tasten ausgeführt werden, berührt werden:

func showConfirmBox(msg:String, title:String, 
    firstBtnStr:String, firstSelector:Selector, 
    secondBtnStr:String, secondSelector:Selector, 
    caller:UIViewController) { 
     let userPopUp = UIAlertController(title:title, 
      message:msg, preferredStyle:UIAlertControllerStyle.Alert) 
     userPopUp.addAction(UIAlertAction(title:firstBtnStr, style:UIAlertActionStyle.Default, 
      handler:{action in caller.firstSelector()})) 
     userPopUp.addAction(UIAlertAction(title:secondBtnStr, style:UIAlertActionStyle.Default, 
      handler:{action in caller.secondSelector()})) 
     caller.presentViewController(userPopUp, animated: true, completion: nil) 
} 

Offensichtlich ich das richtige mit firstSelector und secondSelector bin nicht zu tun, weil das, was ich versucht habe bisher nicht funktioniert hat. Ich nehme an, ich verwende nicht die richtige Syntax für das, was ich will, aber ich bin mir sicher, dass es möglich ist, das zu tun, was ich gerne tun würde. Irgendeine Idee von der Art, es richtig zu machen?

+0

nennen, was Sie meinen „nicht funktioniert“? Bitte geben Sie genauere Informationen an. –

+0

Was ich meine ist, dass ich Fehlermeldungen vom Compiler bekomme. Ich könnte diese einschließen, wenn es nützlich ist. Statt dessen nehme ich an, dass die Syntax in meiner zweiten Funktion einfach falsch ist. – Michel

+0

Ich versuche auf eigene Faust andere Wege zu finden (zB mit Generika), aber an dieser Stelle noch ohne Erfolg. – Michel

Antwort

29

Oneword Antwort auf Ihre Frage ist Closures

Der Standard für Verschlüsse Syntax () ->()

Statt Selector ist direkt die Methode defnition

func showConfirmBox(msg:String, title:String, 
    firstBtnStr:String, firstSelector:(sampleParameter: String) -> returntype, 
    secondBtnStr:String, secondSelector:() -> returntype, 
    caller:UIViewController) { 
    //Your Code 
} 

Aber mit dieser schaffen lesbar Probleme erwähnen könnte also empfehle ich Ihnen, typeAlias ​​

typealias MethodHandler1 = (sampleParameter : String) -> Void 
typealias MethodHandler2 =() -> Void 

func showConfirmBox(msg:String, title:String, 
        firstBtnStr:String, firstSelector:MethodHandler1, 
        secondBtnStr:String, secondSelector:MethodHandler2) { 

    // After any asynchronous call 
    // Call any of your closures based on your logic like this 
    firstSelector("FirstButtonString") 
    secondSelector() 
} 
zu verwenden

Sie können Ihre Methode wie diese

func anyMethod() { 
    //Some other logic 

    showConfirmBox(msg: "msg", title: "title", firstBtnStr: "btnString", 
     firstSelector: { (firstSelectorString) in 
       print(firstSelectorString) //this prints FirstButtonString 
     }, 
     secondBtnStr: "btnstring") { 
      //Invocation comes here after secondSelector is called 

     } 
}