web-dev-qa-db-fra.com

Avertissement de catégorie Xcode 8 Objective-C

J'utilise Xcode 8 et Swift 3.0. Que signifie ce message d'erreur?

ld: avertissement: certains fichiers objets ont des définitions de catégorie Objective-C incompatibles. Certaines métadonnées de catégorie peuvent être perdues. Tous les fichiers contenant des catégories Objective-C doivent être créés à l'aide du même compilateur.

59
jherg

J'ai également eu ce problème dans une extension UIColor, mon application est entièrement réalisée avec Swift sauf pour certains frameworks qui utilisent Objective-c, donc je n'ai aucun problème à déclarer le var as @nonobjc:

extension UIColor {
   @nonobjc static var lol: UIColor {
      return UIColor.red
   }
}

À partir des documents Apple:

L'attribut nonobjc indique au compilateur de rendre la déclaration non disponible dans le code Objective-C ...

Étant donné que ce code n'est pas disponible pour Objective-C, l'avertissement disparaît.

39
juanjo

Dans mon cas, la raison était d'avoir calculé la propriété de type dans une extension:

extension NSParagraphStyle {
    class var defaultStyle: NSParagraphStyle {
        return ...
    }
}

Je ne sais pas quelle est la raison exacte derrière cela, mais pour me débarrasser de l'avertissement, j'ai dû convertir la propriété de type calculé (class var) à une méthode de type (class func):

extension NSParagraphStyle {
    class func defaultStyle() -> NSParagraphStyle {
        return ...
    }
}
22
Hejazi

Cet avertissement est apparu dans mon projet après avoir ajouté un framework qui utilisait Objective-C dans mon application qui utilisait autrement Swift 3 entièrement.

En déclarant toutes les fonctions statiques et variables statiques in toutes les extensions as @nonobjc cet avertissement a disparu.

Par exemple

extension Notification.Name {
    @nonobjc static let MyNotificationName = Notification.Name("NNSongFavoriteStatusDidChangeNotification")
}

ou

extension UIColor {
    @nonobjc static let superGiantRed = UIColor(red: 180.0/255.0, green: 40.0/255.0, blue: 27.0/255.0, alpha: 1.0)
}
10
Groot

Google Analytics pod

Dans Paramètres de construction -> Autres indicateurs de l'éditeur de liens si vous avez le drapeau - ObjC sur - l "GoogleAnalytics", cet avertissement apparaît. Je ne sais pas pourquoi ni comment résoudre, mais peut aussi être votre problème.

7
Renato Ioshida

Dans mon cas, c'était une variable de classe.

public extension NSObject {
    public class var nameOfClass: String{
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }

L'ajout de @nonobjc a aidé.

4
Bogdan

Pour moi, le problème était que j'utilisais un cadre tiers d'un fournisseur construit avec Xcode 7 dans mon Swift 3 application construite avec Xcode 8. Parce que le cadre était un binaire compilé, le seul L'option que j'avais était de demander à mon fournisseur un nouveau framework construit avec la dernière version de Xcode.

3
JAL

J'ai pu résoudre mon problème en changeant la classe " var " en " class func ":

Il y avait:

class var applicationVersionNumber: String {
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "Version Number Not Available"
}

est devenu:

class func applicationVersionNumber() -> String {
    if let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String {
        return version
    }
    return "Version Number Not Available"
}

Source: https://forums.developer.Apple.com/message/146579#146579

1
A.Kant

Plutôt que de marquer chaque membre comme @nonobjc individuellement, vous pouvez plutôt marquer l'extension entière comme @nonobjc:

@nonobjc extension UIStoryboard {
  static let main = UIStoryboard(name: "Main", bundle: nil)
  static let welcome = UIStoryboard(name: "Main", bundle: nil)
}
0
Adam Sharp