web-dev-qa-db-ja.com

Swiftプロパティの不明なタイプ名

Swiftで記述されたCustomViewControllerクラスと、ObjectiveCで記述されたCustomNavigationControllerクラスがあります。CustomNavigationControllerをプロパティとしてCustomViewControllerに追加しようとしています。#import "CustomNavigationController.h"を追加しました。私のブリッジヘッダーに。

私のCustomViewControllerには次のものがあります。

class CustomViewController: UIViewController {

    var navController: CustomNavigationController?
...
//init methods


...


 override func viewDidLoad() {
        super.viewDidLoad()

        //Set up Navigation Controller
        navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as CustomNavigationController!
}

ビルドして実行しようとするまでエラーはありません...「不明なタイプ名 'CustomNavigationController';意味は 'UINavigationController'ですか?」

タイプを認識しない理由を誰かが知っていますか?

16
Nick Yap

Objective-Cコードでは、自動生成された-Swift.hヘッダーをどこかにインポートしています。その同じコードで、beforeその#import行に、#import "CustomNavigationController.h"を挿入します。これらの2つの#importステートメントの順序は非常に重要です。

これは、CustomNavigationControllerが自動生成された-Swift.hヘッダーの前に名前空間にあることを確認することで問題を解決します。したがって、後者は前者を認識し、すべてがうまくいきます。

これは、Objective-CクラスがCustomNavigationControllerについて知る必要がなかった場合は少し厄介ですが、今後の問題を解決し、ハイブリッドプロジェクトでの作業を継続できるようにします。

24
matt

ProjectName-Swift.hで生成されたヘッダーファイルにはProjectName-Bridging-Header.hの内容が自動的に含まれていないようです。これにより、ProjectName-Swift.hをインポートする前にまだ宣言されていない型は、コンパイラでUnknown type nameエラーをスローします。これはバグのようです。

私の回避策は、エラーの原因となっているクラスを前方宣言するProjectName-Swift.hの代替バージョンを作成してから、ProjectName-Swifth.hをインポートすることでした。私はそれをProjectName-Swift-Fixed.hと呼んだ。私にとって、ProjectName-Swift-Fixed.hは次のようになりました:

// ProjectName-Swift-Fixed.h
@class CustomViewController;
#import "ProjectName-Swift.h"

次に、#include "ProjectName-Swift.h"があったコードのどこでも、それを#include "ProjectName-Swift-Fixed.h"に置き換えました。

7
johnboiles

上記の回答で提案されているように#importステートメントの順序を変更しても問題を解決できない場合は、ProjectName-Bridging-Header.h内のファイルでフレームワークのインポートが欠落していないかどうかを確認すると機能する場合があります。

私の場合、ブリッジヘッダーファイルに、そのメソッドの1つでUIImageを使用しているクラスがありました。私のプロジェクトがObjective-Cのみで構成されていて正常に機能したが、このヘッダーをSwiftに公開した場合、エラーを削除するために#import <UIKit/UIKit.h>を追加する必要がありました。

4
Lucifer

これを試して:

navController = self.storyboard.instantiateViewControllerWithIdentifier("CustomNavigationController") as? CustomNavigationController
0
Adam

私は同じ状況に遭遇しました。私の場合、Swiftバージョンを3.0に更新した後に解決されたエラーすべてのターゲット編集>変換>現在にSwift構文。 それが役に立てば幸い

0
Justin Sato