web-dev-qa-db-ja.com

Swiftプロジェクト、Xcodeのインポートフレームワーク

myFrameworkをプロジェクトにインポートしようとしています。 Build Phases-> Link Binary With LibrariesにmyFrameworkを追加しました。

Objective-cの動作:

#import <UIKit/UIKit.h>
#import <myFramework/myFramework.h>

しかし、Swiftでは、No such module myFrameworkエラーが発生します:

import UIKit
import myFramework

Swift documentation によると:

外部フレームワークのインポート

純粋なObjective-Cコードベース、純粋なSwiftコードベース、または混合言語コードベースを持つ外部フレームワークをインポートできます。外部フレームワークをインポートするプロセスは、フレームワークが単一の言語で書かれているか、両方の言語のファイルが含まれているかにかかわらず同じです。外部フレームワークをインポートするときは、インポートするフレームワークのモジュール定義ビルド設定が「はい」に設定されていることを確認してください。

次の構文を使用して、異なるターゲット内の任意のSwiftファイルにフレームワークをインポートできます。

Swift

import FrameworkName

次の構文を使用して、異なるターゲット内の任意のObjective-C .mファイルにフレームワークをインポートできます。

OBJECTIVE-C

@import FrameworkName;

Xcode 5を使用してmyFrameworkを作成しました。Xcode5には「Defines Module」ビルド設定がありません。

問題はどこにありますか?

47
phnmnn

正しく理解できれば、フレームワーク用の個別のビルドターゲットはなく(XCode 5でビルド済み)、フレームワークをプロジェクトのビルドターゲットに含めています。

参照しているドキュメントの部分は、differentターゲット内のフレームワークについてです。フレームワークはプロジェクトのターゲットにあるため、ドキュメントのこの部分はここでは適用されません。

あなたの場合、Swiftファイルでフレームワークのインポートを行うことはできません。そのため、エラーメッセージ "No such module myFramework"が表示されます。 myFrameworkはモジュールではなく、プロジェクトのモジュールの一部です(デフォルトでは製品名によって決定されます)。そのため、フレームワークのクラスにアクセスできる必要があります。

ただし、フレームワークはObjective-Cで記述されています。したがって、あなたがしなければならないのは、 here で説明されているように、ブリッジングヘッダーにSwift向きのクラスをインポートすることです。

これは、モジュールのSwiftインポートとは関係がないことに注意してください。ブリッジングヘッダーファイルのインポートディレクティブは、Objective-CヘッダーファイルをSwift構文に「変換」し、パブリックヘッダーをSwiftに表示するようにコンパイラーに通知するだけです。

では、今何をすべきですか?

  • 最初に、ブリッジングヘッダーに関心のあるヘッダーファイルをインポートします。 Swiftで対話するヘッダーのみをインポートする必要があります。

  • この段階でプロジェクトをコンパイルしてみてください。 XCodeがフレームワークのヘッダーファイルを見つけられない場合、問題はおそらくSwiftまたはXCode 6に関連するものではなく、フレームワーク全般を含む問題です。

  • その後、ブリッジングヘッダー、おそらくAppDelegate.Swiftにインポートしたクラスをインスタンス化してみてください。 XCodeの自動補完により、タイプ名が提供されます。

お役に立てれば。

21
mic

Swiftの場合:

フレームワークの作成:-

  1. Xcodeを開始->新しいXcodeプロジェクトを作成-> iOS->フレームワークとライブラリ-> Cocoa Touch Framework->フレームワークに名前を付けます(例:sampleCocoaFramework)-> Create。

  2. ターゲットを設定->一般->展開情報->展開ターゲット。

  3. パブリッククラスを追加します。File-> New File-> iOS-> Swift File-> Name(ex。openCocoaClass)-> Create。

  4. 次に、openCocoaClass.Swiftにコードを追加します。

    import Foundation
    
    public class openCocoaClass {
    
        public init() {
    
        }
    
        public var samplePublicVariable = "samplePublicVariable @ openCocoaClass"
    
        public func samplePublicFunction()
        {
            print("samplePublicFunction @ openCocoaClass")
        }          
    

    }

  5. プロジェクトのクリーンアップ:製品->クリーンアップ

  6. スキーム設定を構成します:製品->スキーム->スキームの編集->実行->ビルド構成->リリース。

  7. フレームワークをビルドします:製品->ビルド。

  8. フレームワークをエクスポートします。製品->フレームワークを選択-> IDとタイプ->フルパス->リリースされたフレームワーク。

プロジェクトへのフレームワークの追加:-

  1. Xcodeプロジェクトを開始し、名前を付けます(例:CocoaFrameworkTest)。

  2. SampleCocoaFramework.frameworkをCocoaFrameworkTestのプロジェクトフォルダーにドラッグアンドドロップします。

  3. ターゲット->一般->バイナリの埋め込み->その他の追加->フレームワークの選択->必要に応じてアイテムをコピー->完了。

ViewController上のフレームワークへのアクセス:-

import UIKit
import sampleCocoaFramework


class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let frameworkObject =  openCocoaClass.init()
        frameworkObject.samplePublicFunction()
        print(frameworkObject.samplePublicVariable)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}
16
A.G

Swift documentation によると

Objective-Cコードを同じターゲットからSwiftにインポートするには

  1. Objective-Cブリッジングヘッダーファイルで、Swiftに公開するすべてのObjective-Cヘッダーをインポートします。例えば:

    #import "XYZCustomCell.h"

    #import "XYZCustomView.h"

    #import "XYZCustomViewController.h"

  2. [ビルド設定]で、Swiftコンパイラ-コード生成の下にあるObjective-Cブリッジングヘッダーのビルド設定にヘッダーへのパスがあることを確認します。パスは、ファイルが存在するディレクトリではなく、ファイル自体への直接パスである必要があります。パスは、ビルド設定でInfo.plistパスを指定する方法と同様に、プロジェクトに相対的である必要があります。ほとんどの場合、この設定を変更する必要はありません。

このブリッジングヘッダーファイルにリストされているすべてのパブリックObjective-Cヘッダーは、Swiftに表示されます。 Objective-C機能は、インポートステートメントなしで、そのターゲット内のSwiftファイルで自動的に使用可能になります。システムクラスで使用するのと同じSwift構文でカスタムObjective-Cコードを使用します。

let myCell = XYZCustomCell()
myCell.subtitle = "A custom cell"

また、「パッケージ」の下の「モジュールの定義」ビルド設定が「はい」に設定されていることを確認してください。

12
Tomer Even

objective Cプロジェクトには、アプリと同じ名前の公開ヘッダーが必要です。FrameworkName.hの場合は、公開するすべてのクラスを追加します(これらのクラスは、プロジェクトプロパティに公開ヘッダーとして追加する必要があります)それを行うには、フレームワークを追加し、パブリックヘッダーインポートFrameworkNameへの参照を追加します

2

最新のXCodeは、他のプロジェクトにフレームワークを埋め込むオプションを提供します。このリンク( https://stackoverflow.com/a/37328591/1084174 )はうまく機能しました。

0

以下の構文を使用して、外部objCフレームワークをSwiftプロジェクトにインポートできます。

#import "objCExternalFramework-name/headerfilename.h"

0
V V

さて、今はXcode 7.2です。そして、私が観察したのは、Swift importでは大文字と小文字が区別されます。例-import uikitは機能しません。 import UIKitとして入力する必要があります。

ちょうど2セントです。

0
Sukhi