2016-03-25 24 views
-2

'da birden çok parametreyle Seçici'yi tanıyamıyorbazı optional işlevlerine sahibim. Hedefim, temsilci işlevi tarafından temsilci işlevi tarafından gerçekleştirilip gerçekleştirilmediğini kontrol etmektir, eğer evet, eğer yürütürse, varsayılan olarak bazı şeyleri yapın.yanıtSToSelector, Swift

Bu amaçla respondsToSelector kullanıyorum, hiçbir veya bir parametresi olmayan ancak iki parametre için çalışmayan işlevler için iyi çalışıyor.

Herkes yardımcı olabilir mi? Şimdiden teşekkürler. , Benim öz tarafından cevap buldum @Shripada sayesinde

@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

Xcode hangi sürümü size Hangi? Seçici sözdizimi, 7.3 – dpassage

+2

için değiştirildi Bu deseni hızlıca engellemelisiniz. Bunun yerine İsteğe bağlı zincirleme kullanın. – Shripada

+0

XCode 7.2.1 kullanıyorum. – dichen

cevap

4

Selector(String) kullanma şimdi Swift 2.2 (kullanımdan kaldırılmış kabul edilir Xcode 7.3 ile) ve Swift 3'te, kısmen hataya açık olduğu için kaldırılacaktır.

Swift 2.2: #selector()'da yeni bir sözdizimi tanıtıldı. Bu tür güvenlidir ve Xcode siz yazarken otomatik tamamlama sağlar. Kodunuzdaki için Selector(String) aramalar:

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

tarafından değiştirilmelidir:

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

ve kredi https://stackoverflow.com/a/24168825/3543150 gider: tüm fonksiyonlar temsilci nesnesi tarafından uygulanmıştır

Not, işte benim kodudur .

Sen Seçici dizesinde ParameterName belirtmek gerekir:

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

Ve kontrolü için opsiyonel zincir kullanmak daha güzel:

// 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 Ancak, bu sorunun tamamen ortadan kalktığı Xcode 7.3’ü güncelleştirin. – matt

+0

Teşekkürler, yakında yapacak. – dichen