2016-03-24 9 views
5

私のプロジェクトでは、Xcode 7.2でうまく機能していたObjective Cの列挙型に対してSwift拡張があります。Xcode 7.3スウィフトコードのObj C enumの宣言されていないタイプ

Xcode 7.3では、Obj C列挙型を拡張するSwiftファイルで「宣言されていない型」で失敗します。

サンプルプロジェクトをビルドしてコンパイルしてもうまく動作しますが、既存のプロジェクトでObj C列挙型の拡張を受け入れることはできません。

UPDATE:

のXcode 7.2を再インストールした後、私はプロジェクトがコンパイルされ、正常にビルドことを確認することができます。

Xcode 7.2で作業した後、私はこのプロジェクトをXcode 7.3でやり直してみましたが、同じ問題 - > Obj C列挙型のSwift拡張をビルドできません。

Xcode 7.3で派生したデータを消去して削除した後も、Swiftクラスがコンパイルされていないため、ヘッダーがまだ作成されていないため、-Swift.hヘッダーが見つかりません。

コード解説: "FriendRequestResult.h" 内部

マイOBJのC列挙型:

typedef NS_ENUM(NSInteger, FriendStatus) 
{ 
    FriendStatusRequestedByUser = 1, 
    FriendStatusRequestedByOtherUser, 
    FriendStatusFriends, 
    FriendStatusBlocked, 
    FriendStatusNone, 
    FriendStatusError, 
}; 

さて、私のAppNameは、ブリッジング・HEADER.Hで期待どおりに私が持っている:

#import "FriendRequestResult.h" 

次に、Xcode 7.2で作成されたFriendStatusをすばやく拡張しましたが、Xcode 7.3では「宣言されていないタイプの使用」で失敗します。

extension FriendStatus 
{ 
    init(stringValue : String?) 
    { 
     if let stringValue = stringValue 
     { 
      switch stringValue 
      { 
       case "REQUESTED_BY_USER": self = .RequestedByUser 
       case "REQUESTED_BY_OTHER": self = .RequestedByOtherUser 
       case "FRIENDS": self = .Friends 
       case "BLOCKED": self = .Blocked 
       default: self = .None 
      } 
     } 
     else 
     { 
      self = .None 
     } 
    } 
} 

実際には、この列挙型の拡張もいくつかのヘルパー関数を持っていますが、それは決して問題を変えてはいけません。

もちろん、列挙型の拡張が宣言されていない型を与えた場合、この型の使用はSwiftコードのどこでも同じ "宣言されていないもの"で失敗します。基本的には、インポートがブリッジヘッダーで行われていても、プロジェクトのSwift部分では列挙型は表示されません。

この質問は、最初のバージョンから大幅に編集されました。

+0

あなたには、いくつかのサンプルコードを共有する気にしていますか? – Laurent

+0

@JohnDifool、私は試してみるでしょう。しかし、この状況では、あなたが正しい部分を共有していることを確認するのは複雑なようです。 – Fawkes

+0

は、私は新しいハイブリッドプロジェクトを作成し、あなたの 'NS_ENUM(NSInteger、FriendStatus)のtypedef' Objective-Cのヘッダファイルとスウィフトファイル内の '拡張FriendStatus'インチそれはうまくコンパイルされます。エラーをどうやって得るか教えていただけますか? – matt

答えて

8

解決策1: はseaparateヘッダファイルに列挙移動。

マイ列挙宣言は、クラス・ヘッダと同じヘッダ中具体的には、そのクラスの@interfaceと@endの間でした。

Xcode 7.2では、問題は発生せず、ヘッダーの解析は成功しましたが、Xcode 7.3ではおそらく何かを最適化して解析する方法を変更していましたので、クラスを見ていましたが、 @interface @end範囲外の列挙型の宣言を移動:それは

解決策2]はクラス宣言内だ場合、多分それは、プライベートとしてそれを宣言する。

1

質問に答えるには:「Xcodeにスウィフトヘッダーを最初に生成させてもいいですか、Xcodeに自分の列挙型がどこかに存在し、エクステンションを検証する必要がありますか?

ファイルコンパイルを注文する2つの方法が見つかりました。

  1. ターゲットを使用し、それをプロジェクトの依存関係にします。
  2. project.pbxprojファイルを開き、手動でリストを編集します。

リスクと複雑さのレベルに応じて、どちらか一方を選択してください。

ENUMを拡張しようとしましたが、ここでうまくいきます。私が過去に持っていた問題の1つは、Obj-CとSwiftの間の名前の剥奪規約を理解することでしたが、これは実行している問題のようには見えません。 私が直面する他の問題は、常に@#$%Bridging-Header.hファイルを常に維持することです。あなたはこれが最新であるということは肯定的ですか?

+0

残念ながら、私は質問を再調整しなければならないと思います。私のさらなる研究からObj Cの拡張機能のように見えます。列挙型はSwift 2.2とXcode 7.3で動作していませんが、私は現時点で調査中です。バック基本に戻る – Fawkes

+0

今は、このヘッダが生成されていないという事実に関係していないようですが、むしろOBJのCの列挙型は、多分[スウィフト2.2とXcode 7.3]異なっ今スウィフトヘッダーで以前よりも表されていることと、簡単な例をゼロから構築してみてください。それは私がやったことであり、確認するために、物事は彼らがすべきであるように働いています。がんばろう! – Laurent

+1

ええ、ちょうど私自身のサンプルを終了し、あなたもそれを確認したように動作します。 – Fawkes

関連する問題