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

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

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

【问题讨论】:

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

标签: ios objective-c swift xcode xcode8


【解决方案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)
        }
        

        【讨论】:

          猜你喜欢
          • 2017-03-31
          • 2014-08-26
          • 1970-01-01
          • 2011-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多