Appleはそれらが1つのアプリケーションで共存できると述べたが、これはSwiftで新しいクラスを構築しながらObjective-Cで作られた古いクラスを技術的に再利用できるという意味ですか?
Objective-Cはプラットフォームに依存しない言語ですが、Swiftはプラットフォームに依存します。したがって、Swiftでプラットフォームに依存しないコード(ビジネスロジックライブラリ)を書くのは賢明ではありません。しかし、プラットフォームに依存するコード(例えばインターフェース関連)を書くのは全く問題ありません。それは良い考えであると言っているわけではありませんが、それは間違いなく興味です。
**使用したい既存のクラスがある場合は、実行してください。 ステップ2 そしてスキップして ステップ5。 (場合によっては、古いObjective-Cファイルに明示的な#import <Foundation/Foundation.h
を追加する必要がありました。)**
クラスに.m
ファイルを追加し、CustomObject.m
という名前を付けます。
.m
ファイルを追加すると、おそらく以下のようなプロンプトが表示されます。
クリック はい !
プロンプトが表示されなかった場合、または誤ってブリッジヘッダーを削除した場合は、新しい.h
ファイルをプロジェクトに追加して<#YourProjectName#>-Bridging-Header.h
という名前を付けます。
状況によっては、特にObjective-Cフレームワークを扱うときには、Objective-Cクラスを明示的に追加しないとXcodeがリンカを見つけることができません。この場合、.h
ファイルを上記のように作成してから、そのパスをターゲットのプロジェクト設定にリンクしていることを確認してください。
注意
プロジェクトを移動したり、リモートリポジトリを使用して他の人と共同作業したりしても機能するように、$(SRCROOT)
マクロを使用してプロジェクトをリンクすることをお勧めします。 $(SRCROOT)
は、あなたの.xcodeprojファイルを含むディレクトリと考えることができます。このように見えるかもしれません:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
別の.h
ファイルを追加してCustomObject.h
という名前を付けます。
CustomObject.h
内
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
CustomObject.m
内
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
YourProject-Bridging-Header.h
内:
#import "CustomObject.h"
SomeSwiftFile.Swift
内:
var instanceOfCustomObject: CustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
println(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
明示的にインポートする必要はありません。それがブリッジヘッダーの目的です。
プロジェクトに.Swift
ファイルを追加し、MySwiftObject.Swift
という名前を付けます。
MySwiftObject.Swift
内:
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val"
init() {}
func someFunction(someArg:AnyObject) -> String {
var returnVal = "You sent me \(someArg)"
return returnVal
}
}
SomeRandomClass.m
内:
#import "<#YourProjectName#>-Swift.h"
ファイル<#YourProjectName#>-Swift.h
は、見えなくても、すでにプロジェクト内に自動的に作成されているはずです。
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
// original
NSString * retString = [myOb someFunction:@"Arg"];
// xcode10 expands the external arg here
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];|
NSLog(@"RetString: %@", retString);
1。 CodeCompletionが思ったほど正確に動作していませんでした。私のシステムでは、 "cmd + r"でクイックビルドを実行すると、SwiftがObjective-Cのコードを見つけるのに役立ち、またその逆も同様でした。
2。 古いプロジェクトに.Swift
ファイルを追加してエラーが発生した場合:dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
、完全に Xcodeを再起動してください 。
3。 もともとObjective-Cで純粋なSwiftクラスを@objc
接頭辞を使って使うことは可能でしたが、Swift 2.0以降、これはもはや不可能です。オリジナルの説明は編集履歴を見てください。この機能が将来のSwiftバージョンで再び有効になった場合、それに応じて答えが更新されます。
Appleのガイド「 CocoaでSwiftを使用する」および「Objective-C 」を参照してください。このガイドでは、SwiftからのObjective-CおよびCコードの使用方法、およびその逆の方法について説明し、既存のプロジェクトでObjective-C/CおよびSwiftパーツを組み合わせて一致させる方法についての推奨事項を示します。
コンパイラは、C関数とObjective-Cメソッドを呼び出すためのSwift構文を自動的に生成します。ドキュメントに見られるように、このObjective-Cは、
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];
このSwiftコードに変わります:
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)
Xcodeもこの変換をその場で行います - Swiftファイルの編集中にOpen Quicklyを使用してObjective-Cクラス名を入力すると、Swift対応バージョンのクラスヘッダーに移動できます。 (SwiftファイルのAPIシンボルをcmdクリックしても確認できます。) iOS 8 および OS X v10.10(Yosemite) developerライブラリはObjective-CとSwiftの両方の形式で表示されます(例: UIView
)。
以下は、SwiftプロジェクトでObjective-Cコード(この場合はサードパーティによって提供されたフレームワーク)を使用するためのステップバイステップの説明です。
簡単なステップで:
プロンプトが表示されたら、OKをクリックします。表示されない場合は、次のように手動で作成します。iOSソースからヘッダーファイルを1つ作成し、ProjectName-Bridging-Headerという名前を付けます(例:Test -Bridging-Header)をクリックし、Swiftコンパイラコードのビルド設定 - > Objective-CブリッジでObjective-Cブリッジ名を追加します。(Test/Test-Bridging-Header.h)。ええ、これで完了です。
必要に応じて、追加したObjective-Cファイルを削除します(上のGIF画像では "anything"という名前)。もう必要ありません。
ブリッジングヘッダファイルを開く - ファイル名は[YourProject] -Bridging-Header.hの形式です。 Xcode提供のコメントが含まれています。 含めたいObjective-Cファイルに1行のコードを追加します _、サードパーティ製のフレームワークなど。たとえば、Mixpanelをプロジェクトに追加するには、ブリッジングヘッダファイルに次のコード行を追加する必要があります。
#import "Mixpanel.h"
Swiftファイルでは、Swift構文では既存のObjective-Cコードを使用 _(この例の場合は、Mixpanel SDKメソッドなどを呼び出すことができます)。 XcodeがObjective-CをどのようにSwiftに変換するのかを理解する必要があります。 アップルのガイド は読みやすいです。あるいは、不完全な要約についてはこの答えを見てください。
Mixpanelの例:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
Mixpanel.sharedInstanceWithToken("your-token")
return true
}
それでおしまい!
注:プロジェクトからブリッジングヘッダーファイルを削除する場合、必ず「ビルド設定」に移動し、「Swift Compiler - Code」の下の「Objective-Cブリッジングヘッダー」の値を削除してください。ジェネレーション "#:。
Niceという記事を読むことができますSwift&Cocoapods。基本的に、ブリッジングヘッダファイルを作成し、そこにすべてのObjective-Cヘッダを配置する必要があります。それから、ビルド設定からそれを参照する必要があります。その後、Objective-Cのコードを使うことができます。
let manager = AFHTTPRequestOperationManager()
manager.GET(
"http://example.com/resources.json",
parameters: nil,
success: { (operation: AFHTTPRequestOperation!,
responseObject: AnyObject!) in
println("JSON: " + responseObject.description)
},
failure: { (operation: AFHTTPRequestOperation!,
error: NSError!) in
println("Error: " + error.localizedDescription)
})
Appleの文書CocoaとObjective-CでSwiftを使うもご覧ください。
C++、Objective-C、およびSwiftのコードを組み合わせる方法を示す簡単なXcode 6プロジェクトを書きました。
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
特に、SwiftからObjective-CとC++の関数を呼び出すの例です。
重要なのは、共有ヘッダーProject-Bridging-Header.hを作成し、そこにObjective-Cヘッダーを配置することです。
完全な例としてプロジェクトをダウンロードしてください。
ドキュメント :からの引用
モジュールとしてアクセス可能なObjective-Cフレームワーク(またはCライブラリ)は、Swiftに直接インポートできます。これには、Foundation、UIKit、SpriteKitなどのObjective-Cシステムフレームワークすべてと、システムに付属の共通Cライブラリが含まれます。たとえば、Foundationをインポートするには、このインポート文を作業中のSwiftファイルの先頭に追加するだけです。
import Foundation
このインポートにより、NSDate、NSURL、NSMutableData、およびそれらのすべてのメソッド、プロパティ、カテゴリを含むFoundation APIがすべてSwiftで直接利用できるようになります。
@ Loganの回答にとても感謝しています。ブリッジファイルと設定を作成するのに大いに役立ちます。
しかし、これらすべてのステップを実行した後でも、SwiftでObjective-Cクラスは得られません。
私はcocoapods
ライブラリを使用し、それを私のプロジェクトに統合しました。これはpod "pop"
です。
したがって、SwiftでObjective-Cのポッドを使用している場合は、クラスをSwiftに取得またはimport
できない可能性があります。
あなたがしなければならない簡単なことは:
<YOUR-PROJECT>-Bridging-Header
ファイルに行き、#import <ObjC_Framework>
を@import ObjC_Framework
に置き換えます例えば:(Pop library)
交換する
#import <pop/POP.h>
と
@import pop;
clang import
が機能していない場合は#import
を使用してください。
Objective-CライブラリをSwiftに追加しようとしている人へのメモ:-ObjC inBuild Settingsを追加する必要があります->リンク->その他のリンカーフラグ。
New fileメニューをクリックして、ファイル選択言語Objectiveを選択します。その時それは自動的にクラス名を定義するために使われる "Objective-C Bridging Header"ファイルを生成します。
"Swift Compiler - Code Generation"の下の "Objective-C Bridging Header"。
Xcode 10.1のSwift 4.2.1プロジェクトでは、Objective-Cファイルを簡単に追加できます。 Objective-CファイルをSwiftプロジェクトにブリッジするには、以下の手順に従ってください。
Step_01:Swift言語を使って新しいXcodeプロジェクトを作成します。
File
> New
> Project
> objc
。
Step_02:Swiftプロジェクトに新しいObjective-Cファイルを追加します。
File
> New
> File...
> macOS
> Objective-C File
。
Step_03:ごく初期にSwiftプロジェクトに新しいObjective-Cファイルを追加した場合、Xcodeはあなたに尋ねます。
Would you like to configure an Objective-C bridging header
?
Step_04:オプションを選択してください:
Create Bridging Header
。
Step_05:対応するファイルが次の名前で生成されます。
Objc-Bridging-Header.h
。
Step_06:ブリッジヘッダにブリッジファイルパスを設定する必要があります。 Project Navigatorでobjc
という名前のプロジェクトをクリックしてから、以下を選択します。
Build Settings
> Objective-C Bridging Header
> Objc-Bridging-Header.h
。
Step_07:Objc-Bridging-Header.h
をそのボックスにドラッグアンドドロップしてファイルパスを生成します。
Step_08:Objc-Bridging-Header.h
ファイルを開き、使用したいObjective-CファイルをSwiftファイルにインポートします。
#import "SpecialObjcFile.m"
これがSpecialObjcFile.m
の内容です。
#import <Foundation/Foundation.h>
@interface Person: NSObject {
@public
bool busy;
}
@property
bool busy;
@end
Step_09:SwiftファイルでObjective-Cクラスを使うことができます。
override func viewDidLoad() {
super.viewDidLoad()
let myObjcContent = Person()
print(myObjcContent.busy)
}
Objective-Cヘッダー.h
および実装.m
を追加します
プロジェクトに<FileName>.m
および<FileName>.h
ファイルを追加します
ブリッジングヘッダーを追加
。mファイルを追加するときに、_Would you like to configure an Objective-C bridging header
プロンプトで[はい]をクリックします
クラスをブリッジングヘッダーに追加YourProject-Bridging-Header.h
に行を追加#import "<FileName>.h"
NSObject
を拡張する<FileName>.Swift
ファイルをプロジェクトに追加します#import "<#YourProjectName#>-Swift.h"
をObjective-Cファイルに追加します続きを読む こちら
目的-cを使用する双方向アプローチ-c目的-c
1
2
今行ってもいい ありがとう
Appleはこのドキュメントで公式ガイドを提供しています: how-to-call-objective-c-code-from-Swift
関連する部分は次のとおりです。
Objective-Cファイルのセットを同じアプリターゲット内のSwiftコードにインポートするには、Objective-Cブリッジングヘッダーファイルに依存しますこれらのファイルをSwiftに公開します。 Swiftファイルを既存のObjective-Cアプリに追加するか、Objective-Cファイルを既存のSwiftアプリに追加すると、Xcodeはこのヘッダーを作成します。
受け入れる場合、Xcodeは作成中のファイルとともにブリッジングヘッダーファイルを作成し、製品モジュール名の後に「-Bridging-Header.h」を付けて名前を付けます。または、[ファイル]> [新規]> [ファイル]> [オペレーティングシステム]> [ソース]> [ヘッダーファイル]を選択して、ブリッジヘッダーを自分で作成することもできます。
ブリッジングヘッダーを編集して、Objective-CコードをSwiftコードに公開します:
ブリッジングヘッダーにリストされているすべてのパブリックObjective-Cヘッダーは、Swiftに表示されます。
Logans answer は、最新のSwift 5
を除いては正常に動作しますが、コンパイラエラーが発生します。これはSwift 5に取り組んでいる人のための修正です。
import Foundation
class MySwiftObject : NSObject {
var someProperty: AnyObject = "Some Initializer Val" as AnyObject
override init() {}
func someFunction(someArg:AnyObject) -> String {
let returnVal = "You sent me \(someArg)"
return returnVal
}
}