2017-06-30 28 views
12

Yeni ile Swift arasında. Aşağıda, iki parçacıkları vardır:Seçici vs Eylem Swift 4

NotificationCenter.default.addObserver(self, 
    selector:#selector(ViewController.notificationReceived), 
    name: Notification.Name(rawValue: name), object: nil) 

@objc func notificationReceived(notification:Notification){ 
    let x = notification.userInfo! 
    print("\(x["name"]!)") 

} 

ve son olarak

let x:UITapGestureRecognizer = UITapGestureRecognizer(target: self, 
    action: #selector(tapped)) 

self.addGestureRecognizer(x) 

func tapped(){ 
    print("tapped") 

    self.delegate!.theViewTapped() 

} 

Neden böyle notificationCenter içindir? selector parametresi için @objc etiketini sağladım ama UITapGestureRecognizer eylem parametresi için değil mi?

Selector ve Action in Swift arasındaki fark nedir?

+0

karşılaştırın [I Swift 4 #selector() ile @objc çıkarsama kaldırılmasından başa nasıl?] (Https://stackoverflow.com/q/44390378/2976878) - OOPer'in söylediği gibi, her iki örnekler gerektirir hedef yöntemi '@ objc' olacak. – Hamish

cevap

9

Kontrol Swift 4 için bu öneriyi: SE-0160 Limiting @objc inference

teklifte açıklamasına göre, ikinci kod parçacığı da @objc ihtiyacı var.

error: argument of '#selector' refers to instance method 'tapped()' that is not exposed to Objective-C

note: add '@objc' to expose this instance method to Objective-C

Belki ikinci iyi olur düşünmek Swift 4. ile kullanmak için çok yaşlı biraz geçerli: Xcode 9 beta2 ile birlikte

Aslında

, Swift 4 derleyici #selector(tapped) kullanarak hat için bu hatayı oluşturur seçiciden @objc özniteliği ile çağrılan tüm yöntemler.