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.
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.
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 ...
}
}
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)
}
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.
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é.
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.
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
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)
}