Xcode 8とSwift 3.0を使用しています。このエラーメッセージはどういう意味ですか?
ld:警告:一部のオブジェクトファイルには、互換性のないObjective-Cカテゴリ定義があります。一部のカテゴリメタデータが失われる可能性があります。 Objective-Cカテゴリを含むすべてのファイルは、同じコンパイラを使用して構築する必要があります。
また、この問題はUIColor
拡張で発生しました。私のアプリは、Objective-cを使用する一部のフレームワークを除き、Swiftで完全に作成されているため、var
as @nonobjc
:
extension UIColor {
@nonobjc static var lol: UIColor {
return UIColor.red
}
}
Apple docs:
Nonobjc属性は、Objective-Cコードで宣言を使用不可にするようコンパイラーに指示します...
このコードはObjective-Cでは利用できないため、警告は消えます。
私の場合、理由は拡張機能でtypeプロパティを計算していたことです。
extension NSParagraphStyle {
class var defaultStyle: NSParagraphStyle {
return ...
}
}
この背後にある正確な理由がわからないが、警告を取り除くために、計算された型プロパティを変換する必要がありました(class var
)から型メソッドへ(class func
):
extension NSParagraphStyle {
class func defaultStyle() -> NSParagraphStyle {
return ...
}
}
この警告は、Swift 3を完全に使用するアプリケーションでObjective-Cを使用するフレームワークを追加した後、私のプロジェクトに現れました。
すべての静的関数と静的変数 in すべての拡張 as @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ポッド
ビルド設定->その他のリンカーフラグ-ObjC on -l "GoogleAnalytics"フラグがある場合、この警告が表示されます。理由や解決方法はわかりませんが、問題になる可能性もあります。
私の場合、それはクラス変数でした。
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)
}