Objective-C内ではSwiftクラスを使用できません


260

Swiftアプリにコードを統合しようとしています。アプリは記述されてObjective-Cおり、Swiftクラスを追加しました。ここで説明されているすべてを行いまし。しかし、私の問題はXcode-Swift.hファイルを作成していないことです。ブリッジングヘッダーのみです。作成しましたが、実際は空です。私はすべてのObjCクラスをSwiftで使用できますが、その逆はできません。迅速なクラスにマークを付けましたが、@objc役に立ちませんでした。私は今何ができますか?

編集:Appleは次のように述べています。 "SwiftコードをObjective-Cにインポートする場合、Xcode-generatedヘッダーファイルを使用してそれらのファイルをObjective-Cに公開します。[...]このヘッダーの名前は、製品モジュール名で、その後に「 -Swift.h」。 "

今、そのファイルをインポートしようとすると、エラーが発生します。

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

これが私のFBManager.swiftファイルです。

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

27
YourProjectName-Swift.hXcodeがコンパイル時に自動的に作成する魔法のヘッダーファイルである必要があります(実際にはプロジェクトブラウザーに表示されません)。作成したものを削除して#import YourProjectName-Swift.h、Swiftクラスを使用するファイルに追加してください。
グレッグ

3
作成しているアプリの名前はmyProjectModule何ですか?-Swift.hファイルには、アプリ名で開始する必要があります。末尾がのファイルはあります-Bridging-Header.hか?あなたがすべき。その場合、そのファイルの最初の部分はプロジェクト名です。そのファイル名の最初の部分を組み合わせて、それ-Swift.hを含める必要があります。
vacawama

4
私のプロジェクトではこれが正常に機能していますが、実際のファイルが-Swift.hMacで見つからないため、まだ含めることができます。そのため、そのようなファイルを探してハングアップしないでください。正しい名前を付けていることを確認してください。
vacawama

2
@vacawama他のヘッダーファイルにアクセスしているかのように、コマンドを押しながらインポートをクリックしてObjective-Cファイルにインポートステートメントを追加すると、内容を確認できることに注意してください。
Kendall Helmstetter Gelner、2014

4
私は使用しなければなりませんでした#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

回答:


516

私はObjective-Cベースのプロジェクトで有効Swiftにするために約4時間を費やしましたXcode。私のmyproject-Swift.hファイルが正常に作成されましたが、私はXcode私を見ていませんSwift-classes。それで、私は新しいXcodeObjcベースのプロジェクトを作成することを決定し、最終的に正しい答えを見つけました!この投稿が誰かに役立つことを願っています:-)

Xcode ObjcベースのプロジェクトのSwift統合の手順:

  1. 新しい*.swiftファイルを(Xcodeで)作成するか、Finderを使用して追加します。
  2. Objective-C bridging headerXcodeがそれについて尋ねてきたら、を作成します。
  3. Swiftクラスを実装します。

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
  4. ビルド設定を開き、次のパラメーターを確認します。

    • モジュールを定義します: YES

      検索バーにパラメーター名をコピーして貼り付ける

    • 製品モジュール名: myproject

      製品モジュール名に特殊文字が含まれていないことを確認してください

    • Objective-C互換性ヘッダーのインストール: YES

      *.swiftプロジェクトにファイルを追加すると、このプロパティはビルド設定に表示されます

    • Objective-Cで生成されたインターフェイスヘッダー: myproject-Swift.h

      このヘッダーはXcodeによって自動生成されます

    • Objective-Cブリッジヘッダー: $(SRCROOT)/myproject-Bridging-Header.h
  5. * .mファイルにSwiftインターフェースヘッダーをインポートします。

    #import "myproject-Swift.h"

    エラーや警告に注意を払わないでください。

  6. Xcodeプロジェクトをクリーンアップして再ビルドします。
  7. 利益!

2
上記の手順4のdeveloper.apple.com/library/prerelease/ios/documentation/Swift/…にあるドキュメントで、(少なくとも私にとって)必要な構成について言及している人はいます か?もしそうなら私はそれを逃した。@sigに感謝します。
Morkrom

2
私の問題ははるかに単純でした-ファイルが見つからなかったため、機能し"myproject-Swift.h"ていないようです。どうやら、このファイルはプロジェクトナビゲーターに表示されません。
Asaf、2015年

6
@Asaf実際、はい、このファイルはXcodeによって自動生成され、プロジェクトのビルドパスにあります。したがって、このファイルはFinder / Consoleで手動で見つけるか、Cmd + LeftClick onを使用してXcodeで直接開くことができます#import "myproject-Swift.h"
sig 2015年

1
私は#5で問題を解決できました!!
スカイワインダー、2015年

12
あなたのそれらの4時間で、あなたは私たちの時間の何百も節約しました、
どうも

65

ヘッダーファイルを自分で作成しないでください。作成したものを削除します。

Swiftクラスがタグ付けされていること、@objcまたはから直接または間接的に派生するクラスから継承されていることを確認してくださいNSObject

プロジェクトにコンパイラエラーがある場合、Xcodeはファイルを生成しません。プロジェクトが正常にビルドされることを確認してください。


8
構築可能であることは私にとって鍵でした。-swift.hファイルが見つからなかったためビルドできませんでしたが、-swift.hファイルがビルドできなかったため、ビルドできませんでした:/
anders

13
@andersはそのサイクルに閉じ込められているときにfind ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -u、ファイルが私にとってのような予期しない名前で作成されたかどうかを確認するために使用できます。:)
CodeReaper

38

Xcodeにその作業を許可します。手動でSwiftヘッダーを追加/作成しないでください。@objcをSwiftクラスの前に追加するだけです。

@objc class YourSwiftClassName: UIViewController

プロジェクト設定で以下のフラグを検索してYESに変更します(プロジェクトとターゲットの両方)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

次に、プロジェクトをクリーンアップして1回ビルドします。ビルドが成功した後(おそらく)は、objective-c class .mファイルのヘッダーファイルの下にインポートします。

#import "YourProjectName-Swift.h" 

ブーン!


1
おかげで、これは素晴らしく単純で、私の問題を解決しました。
フェリペ

ビルド設定(Xcode 7.3.1)にこれらのオプションが表示されません。私は何をすべきか?
iosdude

1
^からスイッチしなければならなかったBasicAllトップバーインチ
iosdude

1
Embedded Content Contains Swift変更されましたAlways Embed Swift Standard Libraries:Xcodeの8とstackoverflow.com/questions/38792650/...
ウィリアム・グランド

@WilliamGrand提案をありがとう、答えを更新しました。
Bharat Modi

28

フレームワークターゲットをお持ちの方にも役立つと思います。

自動生成されたヘッダーファイルのインポートステートメントは、アプリターゲットとは少し異なります。他の回答で言及されている他のものに加えて、使用

#import <ProductName/ProductModuleName-Swift.h>

の代わりに

#import "ProductModuleName-Swift.h"

フレームワークターゲットのMix&Matchに関するAppleのドキュメントに従って。


1
@dinesharjani助けてくれてうれしい!:)
Jeehut 2017

バンドルターゲットについてはどうですか?
Iulian Onofrei

14

プロジェクトがモジュールを定義し、モジュールに名前を付けていることを確認してください。その後、再構築すると、Xcodeによって-Swift.hヘッダーファイルが作成され、インポートできるようになります。

プロジェクト設定でモジュール定義とモジュール名を設定できます。


14

詳細: Xcode 8.1のSwift 3コードを使用したObjective-Cプロジェクト

タスク:

  1. Objective-CクラスでSwift列挙型を使用する
  2. SwiftクラスでObjective-C列挙型を使用する

完全なサンプル

1. Swift enumを使用するObjective-Cクラス

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Objective-CコードでSwiftコードを検出する

私のサンプルでは、​​SwiftCode.hを使用してObjective-CでSwiftコードを検出します。このファイルは自動的に生成され(プロジェクトでこのヘッダーファイルの物理コピーを作成しませんでした)、このファイルの名前のみを設定できます。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

コンパイラがヘッダーファイルのSwiftコードを見つけられない場合は、プロジェクトをコンパイルしてみてください。

2. Objective-C列挙型を使用するSwiftクラス

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

SwiftコードでObjective-Cコードを検出する

ブリッジングヘッダーファイルを作成する必要があります。Objective-CプロジェクトにSwiftファイルを追加したり、SwiftプロジェクトにObjective-Cファイルを追加したりすると、Xcodeはブリッジヘッダーの作成を提案します。

ここに画像の説明を入力してください

ここでブリッジヘッダーファイル名を変更できます。

ここに画像の説明を入力してください

Bridging-Header.h

#import "ObjcClass.h"

使用法

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

結果

ここに画像の説明を入力してください


その他のサンプル

完全な統合は、Objective-Cのステップとスウィフトは、前述しました。次に、他のコード例をいくつか記述します。

3. Objective-cコードからSwiftクラスを呼び出す

スイフトクラス

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Objective-Cコード(呼び出しコード)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

結果

ここに画像の説明を入力してください

4. SwiftコードからObjective-cクラスを呼び出す

Objective-Cクラス(ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Swiftコード(呼び出しコード)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

結果

ここに画像の説明を入力してください

5. Objective-cコードでSwift拡張機能を使用する

スウィフト拡張

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Objective-Cコード(呼び出しコード)

[UIView swiftExtensionFunc];

6. SwiftコードでObjective-c拡張を使用する

Objective-C拡張(UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Swiftコード(呼び出しコード)

UIView.objcExtensionFunc()

これらのサンプルは本当に役に立ちます、ありがとう!Swift 4+について@objcMembersは、クラスの前に追加する必要があります。@objcSwift 4では最適化のために推論が削減されているためです。たとえば、NSObjectから派生したクラス内のプロパティは、デフォルトで@objcを推測しなくなります(Swift 3のように)。私はこの答えからこの情報を得ました。
Hustlion

11

私は同じ問題を抱えていて、モジュール名の特別な記号がxcodeに置き換えられていることがわかりました(私の場合、ダッシュはアンダースコアになりました)。プロジェクト設定で「モジュール名」をチェックして、プロジェクトのモジュール名を見つけます。その後ModuleName-Swift.h、設定でモジュールを使用するか名前を変更します。


10
私はバカです。クラス名を追加してから「-Swift」を追加していました。それは「モジュール」の名前であることがわかりました。私にこれを認識させるための+1。
HotFudgeSunday

2
クラス名だと思ったもう一人のバカ!
チャーリーマーティン

9

ファイルは自動的に作成されます(Xcode 6.3.2についてはこちら)。ただし、Derived Dataフォルダーにあるため、表示されません。迅速なクラスを@objcでマークした後、コンパイルしてから検索しますSwift.hて、Derived Dataフォルダーをます。Swiftヘッダーがそこにあるはずです。

私はXcodeのが私の名前を変更していること、問題があったmy-Project-Swift.hmy_Project-Swift.hXcodeの好きではない "." "-"などのシンボル。上記の方法でファイル名を見つけ、Objective-Cクラスにインポートできます。


1
これも私の問題を解決しました。私の.mファイルにこのようなファイルをインポートし、#import "my_project-Swift.h" 私の実際のプロジェクト名はmy-project
Bhavin_m

注意-「。」だけではありません。"-"もスペース:(
user1105951 2016年

8

#import "myProject-Swift.h"を.mまたは.hファイルに含めるだけです

PS "myProject-Swift.h"は非表示になっているファイルインスペクターで見つかりません。しかし、それはアプリによって自動的に生成されます。


頭を上げてくれてありがとう、メイト。
フェリペ

この答えは私を助け、私の一日を救いました。重要なことは、Xcodeが自動的に生成し、それがHIDDENファイルであることです。自分で "myProject-Swift.h"を作成していましたが、機能しませんでした。
2016年

5

@sig回答は最高の1つですが、古いプロジェクト(新しいものではありません)ではうまくいきませんでした。いくつかの変更が必要でした。多くのバリエーションの後、私は自分のためのレシピを見つけました(XCode 7.2を使用):

  1. 製品モジュール名:$(PRODUCT_NAME:c99extidentifier)
  2. モジュールの定義:いいえ
  3. 埋め込みコンテンツにはSwiftが含まれています:いいえ
  4. Objective-C互換性ヘッダーのインストール:はい
  5. Objective-Cブリッジヘッダー:ProjectName-Bridging-Header.h

最後のポイント(5)は重要でした。2番目のセクション([ターゲット]フィールド)にのみ配置します。[プロジェクト]フィールドは空のままにする必要があります。ここに画像の説明を入力してくださいそれ以外の場合、適切な "Project-Swift.h"ファイルが生成されませんでした(迅速なメソッドが含まれていませんでした)。



1
@DariusMiliauskasはリンクでのみ機能しました
a4arpan

1
@DariusMiliauskasthanksたくさん!5ポイントは、古いXcodeプロジェクトの問題も解決しました
tatiana_c

Define Modulesする必要がありますNoか?
Sunil Chauhan 2016

@SunilChauhan、はい、framewoksにのみ使用されます
Iulian Onofrei 2016年

5

2つの条件があります。

  • Swiftファイルを目的のCファイルで使用します。
  • Swiftファイルで目的のCファイルを使用します。

したがって、そのためには、次の手順に従う必要があります。

  • SwiftファイルをObjective-Cプロジェクトに追加するか、その逆を行います。
  • ヘッダー(.h)ファイルを作成します。
  • ビルド設定に移動し、検索で以下の手順を実行します、

    1. このテキスト「brid」を検索し、ヘッダーファイルのパスを設定します。
    2. 「モジュールの定義」:はい。
    3. 「常にSwift標準ライブラリを埋め込む」:はい。
    4. 「Objective-C互換性ヘッダーのインストール」:はい。

その後、プロジェクトをクリーンアップして再ビルドします。

Swiftファイルを目的のCファイルで使用します。

その場合は、最初にクラスの前に「@objc」と書いてください。

その後、目的のcファイルに次のように記述します。

  #import "YourProjectName-Swift.h"

Swiftファイルで目的のCファイルを使用します。

その場合、ヘッダーファイルに次のように記述します。

  #import "YourObjective-c_FileName.h"

これがお役に立てば幸いです。


4

Swift 5の場合:

  1. @objcキーワードをクラスとメソッドに追加します
  2. publicクラスとメソッドにキーワードを追加する
  3. クラスから継承させます NSObject
  4. プロジェクトを構築する
  5. 置く#import "MyProject-Swift.h"あなたのObjective-Cファイルに

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

「クラスとメソッドに@objcキーワードを追加する」-Swift 4と同じ
Krzysztof Skrzynecki

3

私の場合、これらの手順とは別に:

  1. 製品モジュール名:myproject
  2. モジュールを定義します:はい
  3. 埋め込みコンテンツにはSwiftが含まれています:はい
  4. Objective-C互換性ヘッダーのインストール:はい
  5. Objective-Cブリッジヘッダー:$(SRCROOT)/Sources/SwiftBridging.h

productName-Swift.hファイルを作成するために、クラスをパブリックとして配置する必要がありました。

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

2

私は、swiftファイルのディレクトリをプロジェクトに追加しても機能しないことを発見しました。最初にディレクトリのグループを作成してから、swiftファイルを追加する必要があります...


@ <特定のクラス>; 定義する必要があります。そうすると、使用中のプロジェクトでこれらのファイルが表示されます。
Nikita

2

私も同じ問題を抱えていましたが、最終的には同じターゲットに接続されていないように見えました。ObjCクラスはTarget1とTarget2にアタッチされ、SwiftクラスはTarget1にのみアタッチされ、ObjCクラス内では表示されません。

これが誰かを助けることを願っています。


ステージングとプロダクションのさまざまなターゲットでこれを完全に見過ごしていました。回答ありがとうございます!
ベンジャミンマーティン

「添付」とはどういう意味ですか?
Iulian Onofrei

"attached" = "members"、それらはターゲットメンバーとしてリストされている必要があります
Dani.Rangelov '30

1

私の問題は、xcodeがブリッジファイルを作成した後に行き詰まったが、それでもヘッダーファイル名MYPROJECTNAME-swift.hでエラーが発生することでした。

1.ターミナルをチェックインし、自動作成されたすべてのSwift Bridgeファイルを検索します。

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

xcodeが作成したものが表示されます。

  1. 私の場合、プロジェクト名にスペースがあり、xcodeはこれを「_」に置き換えます

1

プロジェクトに新しいSwiftファイルを追加するときは、正しいターゲットに追加するようにしてください。使用するすべてのSwiftファイルがNSObjectクラスを継承し、@ ObjCMembersアノテーションが付けられていることを確認してください。ビルド設定内のオプションALWAYS_EMBED_SWIFT_STANDARD_LIBRARIESでYESに変更してください。オプションDEFINES_MODULEの下のビルド設定内でYESに変更します。


0

同じエラーが発生しました:myProjectModule-Swift.hファイルが見つかりません "、しかし私の場合、本当の理由は間違ったデプロイメントターゲットにありました:" Swift10.9より前のOS Xでは使用できません。MACOSX_DEPLOYMENT_TARGET10.9以降に設定してください(現在は「10.7」です)。そのため、デプロイメントターゲットを10.9に変更すると、プロジェクトは正常にコンパイルされました。


0

私の問題は、-swift.hファイルの自動生成がCustomDebugStringConvertibleのサブクラスを理解できないことでした。代わりに、クラスをNSObjectのサブクラスに変更しました。その後、-swift.hファイルにクラスが正しく含まれるようになりました。


0

目的のcブリッジヘッダーにクラスを追加するという問題があり、インポートされた目的のcヘッダーでは、迅速なヘッダーをインポートしようとしていました。それは好きではなかった。

したがって、swiftを使用しているがブリッジされているすべてのObjective-Cクラスでは、重要なのは、ヘッダーで前方クラス宣言を使用していることを確認してから、「*-Swift.h」ファイルを.mファイルにインポートすることです。


0

ビルドの設定を変更したり、@ objをクラスに追加したりする必要はありませんでした。

Objective-cプロジェクトにSwiftクラスを作成したときに自動的に作成されるブリッジヘッダーを作成するだけで済みました。そして、私はただしなければならなかった

"Bedtime-Swift.h" <-その迅速なファイルを使用する必要があったobjective-cファイル内にインポートします。


0

まあ、すべてのコメントを読んで試してからもう一度試してみたところ、SwiftクラスをBig obj-cプロジェクトに含めることができました。だから、すべての助けに感謝します。プロセスをよりよく理解するのに役立つ1つのヒントを共有したいと思いました。.mクラスで、迅速なターゲット名#import "myTargetName-Swift.h"のインポート行に移動して、キーをクリックしました:

コマンド+マウスクリック->定義にジャンプ ここに画像の説明を入力してください

そこでは、swiftからobj-cへのすべての変換を確認でき、obj-cで再宣言されたさまざまな関数を見つけることができます。このヒントが私と同じくらい役立つことを願っています。


0

Objective-CでのSwiftクラスの使用

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

この投稿では、Swift静的ライブラリをObjective-Cコードにインポートする方法について説明します

Objective-Cコンシューマー-> Swift静的ライブラリ

Xcodeバージョン10.2.1

Swift静的ライブラリを作成する

従う Create Swift static library次の追加でます:

Swift APIを公開します。Objective-CからSwiftの機能を使用するには[概要]

ビルド後、[File not found]に<product_name>-Swift.h配置する必要があるDerivedSources ファイルを見つけます。

Swift静的ライブラリーを備えたObjective-Cコンシューマー

Drag and dropXcodeプロジェクトへのバイナリー[概要]

Link Library[未定義のシンボル] [リンクと埋め込み]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Library Search paths[ライブラリが見つかりません] [再帰パス]を追加します

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

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

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

.swift fileをObjective-Cプロジェクトに追加します。[未定義のシンボル] Xcodeが[作成]を要求するときにBridging Header(作成されますmodule_name-Bridging-Header.h)、このファイルへのパスを設定します

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

モジュールをObjective-Cクライアントコードにインポートします[ファイルが見つかりません] [module_name]

#import "module_name-Swift.h"

その他の例はこちら


0

XCode 11.3.1:

objcコードでSwift内部クラスを使用したい場合、「未定義のシンボル」エラーがコンパイルされません(内部クラスと外部クラスの両方に対して)、生成された「-swift.h」ヘッダーを確認しました。両方のクラスがそこ。

何時間も試した後、内部クラスを通常のクラスに変換し、コンパイルします。

プロジェクトをクリーンアップし、DerivedDataフォルダーを削除すると、コンパイルされます。


1
@objc内部クラスの宣言の前に追加しようとしましたか?
dnnagy

@dnnagyに感謝し、構文の問題ではないことを確認しました。
ビルチャン

-1

上記のすべてを行った後も、エラーが発生します。私の問題は結局、必要なSwiftファイルが何らかの理由でバンドルリソースに追加されなかったことになりました。

これを修正するには、[MyTarget]>ビルドフェーズ>バンドルリソースをコピーし、プラスボタンをクリックしてSwiftファイルを追加しました。


コピーバンドルリソースにソースコードを含めないでください
Bill Chan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.