2017-10-18 4 views
1

J'essaie de convertir mon code (écrit en Swift 3) en Swift 4, pour cela j'ajoute @objc si nécessaire. Xcode a fait du bon boulot pour les corriger automatiquement mais je me bats avec quelques uns (tous utilisant les mêmes 2 méthodes), où Xcode ne peut pas aider, il met juste @objc quelque part dans mon code.La substitution de l'extension de la méthode d'instance dépend de l'inférence obsolète de '@objc'

Je remplace une méthode appelée navbarRightButtonAction(button:) comme ceci dans ma classe ViewController.

class ViewController: PBViewController { 
    override func navbarRightButtonAction(button: PBAdaptiveButton) { 
     ... 
    } 
} 

C'est là que je reçois l'avertissement disant:

Override of instance method 'navbarRightButtonAction(button:)' from extension of PBViewController depends on deprecated inference of '@objc' 

Alors je pensais que le problème nous être dans la classe PBViewController qui ressemble à ceci:

extension PBViewController: PBNavigationBarDelegate { 
    func navbarRightButtonAction(button: PBAdaptiveButton) { 
     print("Override this method") 
    } 
} 

J'ajouté @objc func navbarRightButtonAction(button: PBAdaptiveButton) mais ça n'a pas aidé.
Puis j'ai regardé dans le protocole PBNavigationBarDelegate

protocol PBNavigationBarDelegate { 
    func navbarRightButtonAction(button:PBAdaptiveButton) 
} 

J'ai ajouté @objc protocol PBNavigationBarDelegate, mais il n'a pas aidé non plus.
Je n'ai aucune autre idée de ce qu'il faut faire pour réparer l'avertissement de dépréciation.

Répondre

3

Mettre @objc ou @nonobjc devant la extension:

@objc extension PBViewController: PBNavigationBarDelegate 

Jetez un oeil à Limiting @objc Inference, SE-0160 à Swift Evolution pour plus de détails. Il contient l'exemple suivant en ce qui concerne les extensions:

Activation/désactivation de l'inférence @objc dans une extension de

Il pourrait y avoir certaines régions de code pour lequel tous (ou aucun) les points d'entrée doivent être exposé à Objective-C. Autorisez @objc ou @nonobjc à être spécifié sur une extension. @objc ou @nonobjc s'appliqueront à tout membre de cette extension qui n'a pas ses propres annotations @objc ou @nonobjc. Par exemple:

class SwiftClass { } 

@objc extension SwiftClass { 
    func foo() { }   // implicitly @objc 
    func bar() -> (Int, Int) // error: tuple type (Int, Int) not 
     // expressible in @objc. add @nonobjc or move this method to fix the issue 
} 

@objcMembers 
class MyClass : NSObject { 
    func wibble() { } // implicitly @objc 
} 

@nonobjc extension MyClass { 
    func wobble() { } // not @objc, despite @objcMembers 
} 
+0

Merci cela a fonctionné. Je pense que j'ai déjà essayé ça mais cette fois j'ai nettoyé mon projet (cmd + shift + k) et ça a marché. – Codey