ios-Xcode 8 Objective-C类别警告

我正在使用Xcode 8和Swift 3.0。 此错误消息是什么意思?

ld:警告:某些目标文件具有不兼容的Objective-C类别定义。 某些类别元数据可能会丢失。 包含Objective-C类别的所有文件都应使用相同的编译器构建。

jherg asked 2019-10-09T13:39:12Z
8个解决方案
39 votes

我在UIColor扩展中也遇到了这个问题,除了某些使用Objective-c的框架外,我的应用程序完全是由swift编写的,因此我将var声明为@nonobjc没问题:

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

从苹果文档:

nonobjc属性告诉编译器使声明在Objective-C代码中不可用...

由于此代码对于Objective-C不可用,因此警告消失。

juanjo answered 2019-10-09T13:40:04Z
21 votes

就我而言,原因是在扩展中具有计算类型属性:

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

不知道这背后的确切原因是什么,但是要摆脱警告,我不得不将计算的type属性(class var)转换为类型方法(class func):

extension NSParagraphStyle {
    class func defaultStyle() -> NSParagraphStyle {
        return ...
    }
}
Hejazi answered 2019-10-09T13:41:12Z
10 votes

在我的应用程序中添加了一个使用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)
}
Groot answered 2019-10-09T13:42:14Z
7 votes

Google Analytics(分析)窗格

如果您在-l“ GoogleAnalytics”标志上具有-ObjC,则在Build Settings-> Other Linker Flags中,将显示此警告。 我不知道为什么或如何解决,但也可能是您的问题。

Renato Ioshida answered 2019-10-09T13:43:03Z
4 votes

就我而言,这是一个类变量。

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

添加@nonobjc帮助。

Bogdan answered 2019-10-09T13:43:52Z
3 votes

对我来说,问题是我在使用Xcode 8构建的Swift 3应用程序中使用了使用Xcode 7构建的供应商提供的第三方框架。由于该框架是已编译的二进制文件,所以我唯一的选择就是向供应商询问 使用最新版本的Xcode构建的新框架。

JAL answered 2019-10-09T13:44:32Z
1 votes

当我将“ class var”更改为“ class 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]

A.Kant answered 2019-10-09T13:45:42Z
0 votes

您可以将整个扩展名标记为@nonobjc,而不是将每个成员分别标记为@nonobjc

@nonobjc extension UIStoryboard {
  static let main = UIStoryboard(name: "Main", bundle: nil)
  static let welcome = UIStoryboard(name: "Main", bundle: nil)
}
Adam Sharp answered 2019-10-09T13:46:15Z
translate from https://stackoverflow.com:/questions/39665979/xcode-8-objective-c-category-warning