2016-03-25 4 views
-2

Ich habe eine mit einigen optional Funktionen. Mein Ziel ist es, zu überprüfen, ob eine Delegat-Funktion durch das Delegate-Objekt implementiert wird, wenn ja, führen Sie es aus, ansonsten einige Standard-Sachen.AntwortToSelector kann nicht Selektor mit mehr als einem Parameter in Swift

Ich verwende respondsToSelector für diesen Zweck, es funktioniert gut für Funktionen, die nicht oder nur einen Parameter, aber nicht für zwei Parameter funktioniert.

Konnte jemand helfen? Danke im Voraus.

Beachten Sie, dass alle Funktionen des Delegierten-Objekt implementiert worden sind, hier ist mein Code:

@objc protocol ViewControllerDelegate: NSObjectProtocol { 

    optional func doSomethingWithoutParams() 

    optional func doSomethingWithOneParam(controller: ViewController) 

    optional func doSomethingWithTwoParams(controller: ViewController, secondParam: String) 
} 

class ViewController: UIViewController { 

    weak var delegate: ViewControllerDelegate? 

    @IBAction func onButtonClicked(sender: AnyObject){ 

     if (delegate != nil && delegate!.respondsToSelector(Selector("doSomethingWithoutParams"))) { 

      // Entered here 

     } 
     else{ 
      NSLog("doSomethingWithoutParams is not implemented") 
     } 

     if (delegate != nil && delegate!.respondsToSelector(Selector("doSomethingWithOneParam:"))) { 

      // Entered here 

     } 
     else{ 
      NSLog("doSomethingWithOneParam is not implemented") 
     } 

     if (delegate != nil && delegate!.respondsToSelector(Selector("doSomethingWithTwoParams::"))) { 
      NSLog("doSomethingWithTwoParams is implemented") 
     } 
     else{ 

      // Entered here 

      NSLog("doSomethingWithTwoParams is not implemented") 
     } 
    } 
} 
+0

Welche Version von Xcode sind Sie auf:

Selector("doSomethingWithoutParams") Selector("doSomethingWithOneParam:") Selector("doSomethingWithTwoParams::") 

ersetzt werden durch? Die Auswahlsyntax wurde für 7.3 geändert. – dpassage

+2

Sie sollten dieses Muster in swift vermeiden. Verwenden Sie stattdessen die optionale Verkettung. – Shripada

+0

Ich verwende XCode 7.2.1. – dichen

Antwort

4

Selector(String) Mit jetzt in Swift als veraltet angesehen wird 2.2 (mit Xcode 7.3) und wird in Swift 3 entfernt, teilweise weil es fehleranfällig ist.

Eine neue Syntax wurde in Swift 2.2 eingeführt: #selector(). Es ist typsicher und Xcode bietet Autovervollständigung während der Eingabe. Für den Code, die Selector(String) Anrufe:

#selector(ViewControllerDelegate.doSomethingWithoutParams) 
#selector(ViewControllerDelegate.doSomethingWithOneParam(_:) 
#selector(ViewControllerDelegate.doSomethingWithTwoParams(_:secondParam:) 
0

Ich denke, dass ich die Antwort von mir selbst gefunden, dank @Shripada und der Kredit geht an https://stackoverflow.com/a/24168825/3543150 .

Sie müssen die parameter im Selector String angeben:

if (delegate != nil && delegate!.respondsToSelector(Selector("doSomethingWithTwoParams:secondParam:"))) { 

     // Entered here now 

     NSLog("doSomethingWithTwoParams is implemented") 

     delegate!.doSomethingWithTwoParams!(self, secondParam: "dummy") 
    } 
    else{ 

     NSLog("doSomethingWithTwoParams is not implemented") 
    } 

Und es ist schöner, optional Kette für die Prüfung zu verwenden:

// Nicer way 
    guard let _ = delegate?.doSomethingWithTwoParams?(self, secondParam: "dummt") else { 

     NSLog("doSomethingWithTwoParams is not implemented, do some default stuff") 

     return 
    } 
+1

http://www.apeth.com/swiftBook/apa.html#_selectors Aber im Ernst, Update auf Xcode 7.3, wo das ganze Problem komplett weggeht. – matt

+0

Danke, werde es bald tun. – dichen

Verwandte Themen