Xcode 8 Objective-C类别警告

jhe*_*erg 60 xcode objective-c ios swift xcode8

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

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

jua*_*njo 40

我在UIColor扩展中也有这个问题,我的应用程序完全是用swift制作的,除了一些使用Objective-c的框架,所以我在声明varas时没有问题@nonobjc:

extension UIColor {
   @nonobjc static var lol: UIColor {
      return UIColor.red
   }
}
Run Code Online (Sandbox Code Playgroud)

来自苹果文档:

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

由于Objective-C无法使用此代码,因此警告消失.

  • 我必须将@nonobjc添加到我的目标中使用的所有扩展中的所有类和静态变量.只有在那个警告消失之后. (4认同)

Hej*_*azi 22

在我的情况下,原因是在扩展中计算了类型属性:

extension NSParagraphStyle {
    class var defaultStyle: NSParagraphStyle {
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

extension NSParagraphStyle {
    class func defaultStyle() -> NSParagraphStyle {
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Gro*_*oot 10

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

通过声明所有的静态函数和静态变量所有分机作为@nonobjc该警告就走开了.

例如

extension Notification.Name {
    @nonobjc static let MyNotificationName = Notification.Name("NNSongFavoriteStatusDidChangeNotification")
}
Run Code Online (Sandbox Code Playgroud)

要么

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)
}
Run Code Online (Sandbox Code Playgroud)


Ren*_*ida 8

谷歌Analytics(分析)

构建设置 - >其他链接器标志中如果您在-lbjC上显示-l"GoogleAnalytics"标记,则会出现此警告.我不知道为什么或如何解决,但也可能是你的问题.


Bog*_*dan 5

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

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

添加@nonobjc 有帮助。