[英]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.