Предупреждение категории Xcode 8 Objective-C
Я использую Xcode 8 и Swift 3.0. Что означает это сообщение об ошибке?
ld: warning: Некоторые объектные файлы имеют несовместимые определения категории Objective-C. Некоторые метаданные категории могут быть потеряны. Все файлы, содержащие категории Objective-C, должны быть созданы с использованием одного и того же компилятора.
Ответы
Ответ 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)
}