私は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
NSObjectから継承されていないobjcのSwiftクラスにアクセスするには、以下を行う必要があります。
@objcパブリッククラスVeediUtils
Swiftクラスまたはプロトコルは、Objective-Cでアクセス可能かつ使用できるように@objc属性でマークする必要があります。この属性は、このSwift =コードにはObjective-Cからアクセスできます。SwiftクラスがObjective-Cクラスの子孫である場合、コンパイラは自動的に@objc属性を追加します。
以前にSwiftと統合するようにProjectを構成し、Swift Dynamic Frameworkを使用したい場合は、この方法でインポートする必要があります({value}を適切なプロジェクトに応じた名前):
#import <{MyFramework}/{MyFrameworkMainClass}-Swift.h>
#import "{YourProjectTargetName}-Swift.h"
編集:
フレームワークにDefines Module
をtrue
に設定すると、次のようにインポートできます。
@import MyFramework;
@objc
をVeediUtils
クラスの宣言に追加するか、NSObject
から継承する必要があります。そうしないと、Objective-Cから見えなくなります。
あなたの場合、RecognizedClass
は、UIViewController
のサブクラスであるNSObject
のサブクラスであるため、認識されます。
Swift Objective-Cのクラスを使用
App Target内にコードをインポートする場合(1つのプロジェクトでObjective-CとSwiftを混合))、次のインポート行を使用する必要があります#import "<#YourProjectName#>-Swift.h"
SwiftコードをObjective-Cコードに公開 [Swiftおよびプロジェクト内のObjective-Cコード)の混合]
この投稿では、Objective-CコードにSwiftフレームワークをインポートする方法を説明します
Xcodeバージョン10.2.1
フレームワークプロジェクトを作成するか、フレームワークターゲットを作成します
File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework
2つのファイルが生成されます。
Info.plist
-Build Settings -> Info.plist File
<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が生成したヘッダーファイル [約]Drag and drop
Xcodeプロジェクトへのバイナリ [約]
Embed binaries
[ライブラリがロードされていません][リンクと埋め込み]
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework` file
フレームワークを自動的に追加します:
Project editor -> select a target -> General -> Linked Frameworks and Libraries
Project editor -> select a target -> Build Phases -> Embed Frameworks
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;