2015-11-15 12 views
14

Mam następujący funkcja działa jak oczekuję, w iOS 8:Przechodząc funkcji jako parametry w 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) 
} 

chciałbym zrobić coś takiego jak poniżej, aby przekazać jako argumenty metod być wykonywane, gdy jeden lub drugi z przycisków będą dotknął:

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

Oczywiście nie robię słusznie z firstSelector i secondSelector, ponieważ to, co próbowałem do tej pory nie udało się. Przypuszczam, że nie używam właściwej składni w tym, czego chcę, ale jestem pewien, że można robić to, co chciałbym robić. Masz pomysł, jak to zrobić właściwie?

+0

Co to znaczy „nie działa”? Podaj więcej szczegółowych informacji. –

+0

Mam na myśli to, że otrzymuję komunikaty o błędach z kompilatora. Mogłabym je uwzględnić, jeśli jest przydatna. Zamiast tego przypuszczam, że składnia w mojej drugiej funkcji jest po prostu błędna. – Michel

+0

Próbuję na własną rękę, aby znaleźć inne sposoby (na przykład przy użyciu generyków), ale w tym momencie wciąż bez powodzenia. – Michel

Odpowiedz

29

oneword odpowiedź na Twoje pytanie jest Closures

Domyślny Składnia dla zamknięć jest () ->()

Zamiast Selector można bezpośrednio wspomnieć o metodzie defnition

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

Ale za pomocą tego stworzy problemy czytelne więc sugeruję użycie 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() 
} 

można nazwać metoda jak ten

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 

     } 
}