Подтвердить что ты не робот

Предупреждение категории Xcode 8 Objective-C

Я использую Xcode 8 и Swift 3.0. Что означает это сообщение об ошибке?

ld: warning: Некоторые объектные файлы имеют несовместимые определения категории Objective-C. Некоторые метаданные категории могут быть потеряны. Все файлы, содержащие категории Objective-C, должны быть созданы с использованием одного и того же компилятора.

4b9b3361

Ответ 1

У меня также была эта проблема в расширении UIColor, мое приложение полностью создано с быстрым, за исключением некоторых фреймворков, которые используют Objective-c, поэтому у меня нет проблем в объявлении var как @nonobjc:

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

Из документов apple:

Атрибут nonobjc сообщает компилятору, что объявление не доступно в коде Objective-c...

Поскольку этот код недоступен для Objective-c, предупреждение исчезает.

Ответ 2

В моем случае причина заключалась в вычислении свойства type в расширении:

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

Не знаю, в чем заключается конкретная причина, но чтобы избавиться от предупреждения, мне пришлось преобразовать свойство вычисленного типа (class var) в метод типа ( class func):

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

Ответ 3

Это предупреждение появилось в моем проекте после добавления рамки, которая использовала Objective-C в моем приложении, которое в противном случае полностью использовало Swift 3.

Объявив все статические функции и статические переменные в всех расширениях как @nonobjc, это предупреждение исчезло.

Например

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

или

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

Ответ 4

Google Analytics pod

В Настройки сборки → Другие флаги компоновщика, если у вас есть флаг -ObjC на -l "GoogleAnalytics" , это предупреждение появится. Я не знаю, почему и как разрешать, но может быть и вашей проблемой.

Ответ 5

В моем случае это была переменная класса.

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

Добавлена ​​поддержка @nonobjc.

Ответ 6

Для меня проблема заключалась в том, что я использовал стороннюю структуру от поставщика, созданного с помощью Xcode 7, в моем приложении Swift 3, построенном с Xcode 8. Поскольку фреймворк был скомпилированным двоичным кодом, единственным вариантом, который у меня был, было спросить мой поставщик для новой структуры, построенной с последней версией Xcode.

Ответ 7

Мне удалось решить мою проблему, когда я изменил класс var "на класс func":

Был:

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

Стало:

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

Источник: https://forums.developer.apple.com/message/146579#146579

Ответ 8

Вместо того, чтобы отмечать каждый элемент как @nonobjc индивидуально, вы можете вместо этого отметить все расширение как @nonobjc:

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