Xcode 8 Objective-C类别警告

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

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

我也有一个UIColor扩展这个问题,我的应用程序完全是用快速除了一些使用Objective-C的框架,所以我没有问题在声明@nonobjc@nonobjc

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

从苹果文档:

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

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

就我而言,原因是在扩展中计算了types属性:

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

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

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

这个警告出现在我的项目中,在我的应用程序中添加了一个使用Objective-C的框架,否则完全使用了Swift 3。

通过在@nonobjc声明所有 扩展中的 所有静态函数和静态variables ,这个警告就消失了。

例如

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

Google Analytics(分析)窗格

生成设置 – >其他链接标志,如果你有-ObjC -l“GoogleAnalytics”标志,这个警告就会出现。 我不知道为什么或如何解决,但也可能是你的问题。

在我的情况下,这是一个类variables。

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

添加@nonobjc帮助。

对我来说,问题在于我在用Xcode 8构build的Swift 3应用程序中使用了由Xcode 7构build的供应商提供的第三方框架。由于该框架是一个编译的二进制文件,因此唯一的select是要求供应商用最新版本的Xcode构build的新框架。

当我将“ 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

而不是单独将每个成员标记为@nonobjc ,则可以将整个扩展标记为@nonobjc

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