web-dev-qa-db-ja.com

Xcode 8 Objective-Cカテゴリの警告

Xcode 8とSwift 3.0を使用しています。このエラーメッセージはどういう意味ですか?

ld:警告:一部のオブジェクトファイルには、互換性のないObjective-Cカテゴリ定義があります。一部のカテゴリメタデータが失われる可能性があります。 Objective-Cカテゴリを含むすべてのファイルは、同じコンパイラを使用して構築する必要があります。

59
jherg

また、この問題はUIColor拡張で発生しました。私のアプリは、Objective-cを使用する一部のフレームワークを除き、Swiftで完全に作成されているため、var as @nonobjc

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

Apple docs:

Nonobjc属性は、Objective-Cコードで宣言を使用不可にするようコンパイラーに指示します...

このコードはObjective-Cでは利用できないため、警告は消えます。

39
juanjo

私の場合、理由は拡張機能でtypeプロパティを計算していたことです。

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

この背後にある正確な理由がわからないが、警告を取り除くために、計算された型プロパティを変換する必要がありました(class var)から型メソッドへ(class func):

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

この警告は、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)
}
10
Groot

Google Analyticsポッド

ビルド設定->その他のリンカーフラグ-ObjC on -l "GoogleAnalytics"フラグがある場合、この警告が表示されます。理由や解決方法はわかりませんが、問題になる可能性もあります。

7
Renato Ioshida

私の場合、それはクラス変数でした。

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

@nonobjcを追加すると役に立ちました。

4
Bogdan

私にとっての問題は、Xcode 8でビルドされた私のSwift 3アプリケーションでXcode 7でビルドされたベンダーのサードパーティフレームワークを使用していたことでした。私が持っていた選択肢は、Xcodeの最新バージョンで構築された新しいフレームワークをベンダーに依頼することでした。

3
JAL

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

1
A.Kant

各メンバーを@nonobjcとして個別にマークするのではなく、拡張全体を@nonobjcとしてマークすることができます。

@nonobjc extension UIStoryboard {
  static let main = UIStoryboard(name: "Main", bundle: nil)
  static let welcome = UIStoryboard(name: "Main", bundle: nil)
}
0
Adam Sharp