Xcode 8 Objective-C 类别警告

Posted

技术标签:

【中文标题】Xcode 8 Objective-C 类别警告【英文标题】:Xcode 8 Objective-C category warning 【发布时间】:2017-02-01 14:55:01 【问题描述】:

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

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

【问题讨论】:

看到这个github.com/Carthage/Carthage/issues/1482和这个forums.developer.apple.com/thread/49618 谢谢。我实际上在发布之前看到了这些。他们没有答案。 您是否扩展了警告信息?通常在该行的最右侧有一个图标,它将展开消息并让您查看命令行调用和结果。 @MobileBen 是的,谢谢。我在那里没有看到任何有用的东西。 刚得到这个......这里没有任何东西可以工作:/ 【参考方案1】:

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

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

来自苹果文档:

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

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

【讨论】:

我必须将@nonobjc 添加到目标中使用的所有扩展中的所有类和静态变量中。只有在该警告消失后。 该死的我试图使用正则表达式来查找所有具有静态属性的扩展,但是 Xcode ? 本身【参考方案2】:

在我的例子中,原因是扩展中有计算类型属性:

extension NSParagraphStyle 
    class var defaultStyle: NSParagraphStyle 
        return ...
    

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

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

【讨论】:

我正在尝试使用 UIColor 的扩展来拥有我自己的一组颜色。它们必须是函数吗?在以前的 Swift 版本中,你有 UIColor.whiteColor(),但现在它是 UIColor.white。我想要 UIColor.myColor。知道如何实现吗? 您可以根据需要忽略警告,一切正常。但不确定您是否可以使用 ObjC 代码中的该属性。 @Hejazi 有没有办法抑制这个警告?或者说忽略警告,你的意思是假装你没有看到它? @Ismail AFAIK,没有办法在 Swift 中抑制警告。我的意思是你可以暂时忽略这个警告(直到 Apple 修复了一个似乎是 swift 编译器的错误),或者像我之前所说的那样使用类型方法而不是计算类型属性。 我看到了这个警告并找到了这个答案。我怀疑它是否对我有用,因为警告似乎与答案无关,但答案修复了警告。【参考方案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】:

谷歌分析 pod

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

【讨论】:

@Raniys 不,我的朋友,我认为这将在谷歌更新他们的存储库时得到解决。如果您删除 -ObjC 标志,警告就会消失,但我不知道可能导致您的项目的问题 @Raniys 你好,我的朋友,我注意到在我的 pod 安装之后,出现了这个警告 "[!] project[Debug] 目标覆盖了在 `podsFolder. xcconfig'。这可能会导致 CocoaPods 安装出现问题"。当我更正此警告时,在我的构建设置中,XCode 警告消失了。【参考方案5】:

在我的例子中,它是一个类变量。

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

添加@nonobjc 有帮助。

【讨论】:

【参考方案6】:

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

【讨论】:

你能告诉我们它是哪个库吗? @allaire 这是 Adob​​e 的专有 SDK。 啊太糟糕了。我面临着类似的问题,但我没有动力一一删除 pod :( @allaire 这个问题应该只发生在预构建的框架中。如果你有任何 cocoapods 的源代码(pod 是从源代码构建的),你可以排除这些,因为你知道它们是用你正在使用的最新版本的 Xcode 构建的 我怀疑 Cocoapods 中的静态库(如 Google Analytics)【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

以上是关于Xcode 8 Objective-C 类别警告的主要内容,如果未能解决你的问题,请参考以下文章

Xcode 内存警告 - 无法加载任何 Objective-C 类信息

Xcode 7.3 / Swift 2:“没有使用 Objective-C 选择器声明的方法”警告

XCode 4.5 警告父/子类的类别之间的方法名称冲突

如何在 Xcode 7.2 中创建类别? [复制]

xcode >= 8 无法编译我的 Objective-C 库

针对 Objective-C 枚举的新 Swift 5 警告:如何摆脱它们?