web-dev-qa-db-ja.com

SwiftフレームワークをObjective-Cプロジェクトにインポートする

私はSwiftフレームワークを次のようなObjective-Cプロジェクトにインポートしています:

@import MyFramework;

問題は、フレームワークをインポートしているクラスが一部のクラスのみを認識していることです。

認識されるクラス:

public class RecognizedClass:UIViewController, WKNavigationDelegate, WKScriptMessageHandle 
 { ... } 

次のクラスではありません:

public class VeediUtils
{ ... } 

それらは両方とも公開されているので、なぜ最初のものがワークスペースで認識され、もう一方が認識されないのですか?

また、ヘッダーファイルMyFramework-Swift.hでクラス

@interface RecognizedClass : UIViewController <WKNavigationDelegate, WKScriptMessageHandler>

他がいけない間に現れる

何故ですか?

また、Swift framework to Swift project

17
Michael A

NSObjectから継承されていないobjcのSwiftクラスにアクセスするには、以下を行う必要があります。

@objcパブリッククラスVeediUtils

Swiftクラスまたはプロトコルは、Objective-Cでアクセス可能かつ使用できるように@objc属性でマークする必要があります。この属性は、このSwift =コードにはObjective-Cからアクセスできます。SwiftクラスがObjective-Cクラスの子孫である場合、コンパイラは自動的に@objc属性を追加します。

https://developer.Apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html

24
fat

以前にSwiftと統合するようにProjectを構成し、Swift Dynamic Frameworkを使用したい場合は、この方法でインポートする必要があります({value}を適切なプロジェクトに応じた名前):

#import <{MyFramework}/{MyFrameworkMainClass}-Swift.h>  
#import "{YourProjectTargetName}-Swift.h"

編集:

フレームワークにDefines Moduletrueに設定すると、次のようにインポートできます。

@import MyFramework;
29
saltwat5r

@objcVeediUtilsクラスの宣言に追加するか、NSObjectから継承する必要があります。そうしないと、Objective-Cから見えなくなります。

あなたの場合、RecognizedClassは、UIViewControllerのサブクラスであるNSObjectのサブクラスであるため、認識されます。

4
Cihan Tek

Swift Objective-Cのクラスを使用

App Target内にコードをインポートする場合(1つのプロジェクトでObjective-CとSwiftを混合))、次のインポート行を使用する必要があります#import "<#YourProjectName#>-Swift.h" SwiftコードをObjective-Cコードに公開 [Swiftおよびプロジェクト内のObjective-Cコード)の混合]

この投稿では、Objective-CコードにSwiftフレームワークをインポートする方法を説明します

Objective-Cコンシューマー-> Swift動的フレームワーク

Xcodeバージョン10.2.1

Swiftフレームワークを作成する

フレームワークプロジェクトを作成するか、フレームワークターゲットを作成します

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

2つのファイルが生成されます。

  1. Info.plist-Build Settings -> Info.plist File
  2. <product_name>.h-Build Phases -> Headers。アンブレラヘッダーファイルです [約]

追加ファイル .Swift

Select `.Swift` file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

Expose SwiftAPI。Objective-CからSwiftの関数を使用するには [約]

ビルドライブラリ- ⌘ Command + B またはProduct -> Build

注:クライアントコードと同じプロセスアーキテクチャ用のフレームワークをビルドしてください。

生成された出力を見つける [ビルド場所]

Products group -> <product_name>.framework -> Show in Finder

フレームワークには

  • Info.plist
  • Modulesフォルダー:
    • module.modulemap[約][カスタムモジュールマップ] このファイルは、Build Settings -> Defines Module -> YES
    • <product_name>.swiftmoduleフォルダー
      • .swiftdoc-ドキュメント
      • .swiftmodule-パブリックインターフェイス/定義
  • Headersフォルダー:
    • Headersセクションのファイル。パブリックインターフェイス/定義があります
    • <product_name>-Swift.h-Xcodeが生成したヘッダーファイル [約]

Swiftフレームワークを使用する

Drag and drop Xcodeプロジェクトへのバイナリ [約]

Embed binaries[ライブラリがロードされていません][リンクと埋め込み]

Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file

フレームワークを自動的に追加します:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. Project editor -> select a target -> Build Phases -> Link Binary With Libraries

追加 Framework Search paths[モジュールが見つかりません][再帰パス]

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of `<product_name>.framework` file

Objective-Cクライアントコードへのモジュールのインポート [モジュール名]

@import module_name;

その他の例はこちら

0
yoAlex5