簡體   English   中英

Xcode 8 Objective-C類別警告

[英]Xcode 8 Objective-C category warning

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

ld:警告:某些目標文件具有不兼容的Objective-C類別定義。 某些類別元數據可能會丟失。 所有包含Objective-C類別的文件都應使用相同的編譯器構建。

我在UIColor擴展中也遇到了這個問題,除了某些使用Objective-c的框架之外,我的應用程序完全是由swift制作的,因此我在將var聲明為@nonobjc沒有問題:

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

從蘋果文檔:

nonobjc屬性告訴編譯器使聲明在Objective-C代碼中不可用...

由於此代碼對於Objective-C不可用,因此警告消失。

就我而言,原因是在擴展中具有計算類型屬性:

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

不知道這背后的確切原因是什么,但是為了擺脫警告,我不得不將計算的type屬性( class var )轉換為類型方法( class func ):

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

在我的應用程序中添加了一個使用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)
}

Google Analytics(分析)窗格

如果您在-l“ GoogleAnalytics”標志上具有-ObjC ,則在Build Settings-> Other Linker Flags中 ,將顯示此警告。 我不知道為什么或如何解決,但也可能是您的問題。

就我而言,這是一個類變量。

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

添加@nonobjc幫助。

對我來說,問題是我在使用Xcode 8構建的Swift 3應用程序中使用了使用Xcode 7構建的供應商提供的第三方框架。由於該框架是已編譯的二進制文件,所以我唯一的選擇就是向供應商詢問使用最新版本的Xcode構建的新框架。

當我將“ 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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM