2015-11-15 8 views
14

Ho la seguente funzione a lavorare come mi aspetto, in iOS 8:funzioni come parametri Passando Swift

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

Vorrei fare qualcosa di simile a quanto segue, al fine di passare come argomenti i metodi da eseguito quando uno o l'altro dei pulsanti stanno per essere toccato:

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

Ovviamente non sto facendo la cosa giusta con firstSelector e secondSelector, perché quello che ho provato fino ad ora non ha funzionato. Suppongo che non sto usando la sintassi giusta per quello che voglio, ma sono sicuro che è possibile fare ciò che mi piacerebbe fare. Qualche idea sul modo di farlo correttamente?

+0

Cosa vuol dire "non ha funzionato"? Si prega di fornire informazioni più specifiche. –

+0

Quello che voglio dire è che ottengo messaggi di errore, dal compilatore. Potrei includere quelli se è utile. Piuttosto che suppongo che la sintassi nella mia seconda funzione sia semplicemente sbagliata. – Michel

+0

Sto cercando da solo di trovare altri modi (usando i generici per esempio) ma a questo punto ancora senza successo. – Michel

risposta

29

Oneword risposta per la tua domanda è Closures

La sintassi predefinita per le chiusure è () ->()

Invece di Selector si potrebbe citare direttamente il metodo defnizione

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

Ma usando questo creerà problemi leggibili quindi ti suggerisco di usare 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() 
} 

È possibile chiamare il metodo come questo

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 

     } 
}