我正在使用Xcode 8和Swift 3.0。这个错误信息是什么意思?
ld: 警告: 一些目标文件具有不兼容的Objective-C类别定义。一些类别元数据可能会丢失。所有包含Objective-C类别的文件都应该使用相同的编译器构建。
我正在使用Xcode 8和Swift 3.0。这个错误信息是什么意思?
ld: 警告: 一些目标文件具有不兼容的Objective-C类别定义。一些类别元数据可能会丢失。所有包含Objective-C类别的文件都应该使用相同的编译器构建。
我在一个UIColor
扩展中也遇到了这个问题,我的应用程序完全由Swift编写,除了一些使用Objective-c的框架以外,因此我可以毫无问题地将var
声明为@nonobjc
:
extension UIColor {
@nonobjc static var lol: UIColor {
return UIColor.red
}
}
来自苹果文档:
nonobjc 属性告诉编译器在 Objective-C 代码中使声明不可用...
由于此代码对Objective-C不可用,所以警告消失了。
extension NSParagraphStyle {
class var defaultStyle: NSParagraphStyle {
return ...
}
}
不确定背后的确切原因是什么,但为了消除警告,我不得不将计算的类型属性 (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 Pod
如果在 构建设置 -> 其他链接标志中,您的-l"GoogleAnalytics"后面带有-ObjC标志,则会出现此警告。我不知道为什么或如何解决,但这也可能是您的问题。
project[Debug]
target overrides the ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
build setting defined in `podsFolder.xcconfig'. This can lead to problems with the CocoaPods installation"。当我在我的构建设置中纠正了这个警告之后,XCode的警告就消失了。 - Renato Ioshidapublic extension NSObject {
public class var nameOfClass: String{
return NSStringFromClass(self).components(separatedBy: ".").last!
}
我的问题是我在使用一个第三方框架,这个框架是由一个供应商使用Xcode 7构建的,而我的Swift 3应用是使用Xcode 8构建的。因为该框架是编译二进制文件,所以我唯一的选择是要求我的供应商提供一个使用最新版本的Xcode构建的新框架。
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"
}
不必逐个标记每个成员为@nonobjc
,您可以将整个扩展标记为@nonobjc
:
@nonobjc extension UIStoryboard {
static let main = UIStoryboard(name: "Main", bundle: nil)
static let welcome = UIStoryboard(name: "Main", bundle: nil)
}