Xcode 8 Objective-C类别警告
我正在使用Xcode 8和Swift 3.0。 这个错误信息是什么意思?
ld:警告:某些目标文件具有不兼容的Objective-C类别定义。 某些类别元数据可能会丢失。 包含Objective-C类别的所有文件应该使用相同的编译器进行构build。
我也有一个UIColor
扩展这个问题,我的应用程序完全是用快速除了一些使用Objective-C的框架,所以我没有问题在声明@nonobjc
为@nonobjc
:
extension UIColor { @nonobjc static var lol: UIColor { return UIColor.red } }
从苹果文档:
nonobjc属性告诉编译器在Objective-C代码中声明不可用。
由于此代码对Objective-C不可用,所以警告消失。
就我而言,原因是在扩展中计算了types属性:
extension NSParagraphStyle { class var defaultStyle: NSParagraphStyle { return ... } }
不知道这背后的确切原因是什么,但为了摆脱警告,我不得不将计算的types属性( class var
)转换为types方法( class func
):
extension NSParagraphStyle { class func defaultStyle() -> NSParagraphStyle { return ... } }
这个警告出现在我的项目中,在我的应用程序中添加了一个使用Objective-C的框架,否则完全使用了Swift 3。
通过在@nonobjc
声明所有 扩展中的 所有静态函数和静态variables ,这个警告就消失了。
例如
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(分析)窗格
在生成设置 – >其他链接标志,如果你有-ObjC -l“GoogleAnalytics”标志,这个警告就会出现。 我不知道为什么或如何解决,但也可能是你的问题。
在我的情况下,这是一个类variables。
public extension NSObject { public class var nameOfClass: String{ return NSStringFromClass(self).components(separatedBy: ".").last! }
添加@nonobjc帮助。
对我来说,问题在于我在用Xcode 8构build的Swift 3应用程序中使用了由Xcode 7构build的供应商提供的第三方框架。由于该框架是一个编译的二进制文件,因此唯一的select是要求供应商用最新版本的Xcode构build的新框架。
当我将“ 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) }