[解決済み] SwiftからObjective-Cのコードを呼び出すにはどうしたらいいですか?
質問
Swiftでは、Objective-Cのコードをどのように呼び出すのですか?
Appleは1つのアプリケーションで共存できると言っていましたが、これは技術的にObjective-Cで作られた古いクラスを再利用しながら、Swiftで新しいクラスを作ることができるということでしょうか?
どうすればいい?
SwiftでObjective-Cのクラスを使用する
<ブロッククオート
既存のクラスを使いたい場合は、以下のようにします。
ステップ2
に進みます。
ステップ5
. (いくつかのケースで、私は明示的に
#import <Foundation/Foundation.h
を古いObjective-CのFileに追加しました)。
ステップ1:Objective-Cの実装を追加する -- .m
を追加します。
.m
ファイルを作成し、その名前を
CustomObject.m
.
ステップ2:ブリッジングヘッダーの追加
を追加する際に
.m
ファイルでは、次のようなプロンプトが表示されることがあります。
クリック はい !
プロンプトが表示されなかった場合、または誤ってブリッジングヘッダを削除してしまった場合は、新しい
.h
ファイルをプロジェクトに追加し、その名前を
<#YourProjectName#>-Bridging-Header.h
.
状況によっては、特にObjective-Cフレームワークで作業している場合、Objective-Cクラスを明示的に追加せず、Xcodeがリンカーを見つけられないことがあります。この場合、あなたの
.h
という名前のファイルを作成し、ターゲットのプロジェクト設定で、そのパスを以下のようにリンクしてください。
注
プロジェクトのリンクは
$(SRCROOT)
マクロを使用すると、プロジェクトを移動したり、リモートリポジトリを使用して他の人と一緒に作業したりしても、そのまま動作します。
$(SRCROOT)
は、.xcodeproj ファイルを含むディレクトリと考えることができます。以下のような感じです。
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
ステップ3:Objective-Cヘッダーの追加 -- .h
別の
.h
というファイルを作成し、その名前を
CustomObject.h
.
ステップ4:Objective-Cクラスの構築
で
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
ステップ5:Bridging-Headerにクラスを追加する
で
YourProject-Bridging-Header.h
:
#import "CustomObject.h"
ステップ6:オブジェクトを使用する
で
SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
明示的にインポートする必要はありません。そのためのブリッジングヘッダです。
Objective-CでSwiftクラスを使用する
ステップ1: 新しいSwiftクラスの作成
を追加します。
.swift
ファイルをプロジェクトに追加し、その名前を
MySwiftObject.swift
.
で
MySwiftObject.swift
:
import Foundation
@objc(MySwiftObject)
class MySwiftObject : NSObject {
@objc
var someProperty: AnyObject = "Some Initializer Val" as NSString
init() {}
@objc
func someFunction(someArg: Any) -> NSString {
return "You sent me \(someArg)"
}
}
ステップ2:SwiftファイルをObjCクラスにインポートする
で
SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
ファイルです。
<#YourProjectName#>-Swift.h
は、たとえ表示されていなくても、すでにあなたのプロジェクトに自動的に作成されているはずです。
ステップ3: 作成したクラスを使用する
MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];
NSLog(@"RetString: %@", retString);
注意事項
-
コード補完の動作が期待通りにならない場合は、以下のコマンドでクイックビルドを実行してみてください。 ⌘ ⇧ R を使用して、Xcode が Swift のコンテキストから Objective-C コードの一部を見つけるのを助け、逆もまた同様です。
-
を追加した場合
.swift
ファイルを古いプロジェクトに追加すると、エラーdyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
であれば、完全に Xcodeを再起動する . -
元々、純粋な Swift クラスを使用することは可能でしたが (
NSObject
を使用することでObjective-Cから見えるようになります。@objc
という接頭辞を付けることができなくなりました。現在、Objective-C で見えるようにするには、Swift オブジェクトがNSObjectProtocol
(を継承するのが最も簡単な方法です。NSObject
であること)、あるいはenum
マーク@objc
のような整数型の生の値で指定します。Int
. を使用したSwift 1.xのコードの例については、編集履歴をご覧ください。@objc
これらの制約を受けずに
関連
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] Objective-Cの定数
-
[解決済み] Swift言語におけるエクスクラメーションマークの意味とは?
-
[解決済み] ターゲット・パターンに '%' が含まれていません。メイクファイル
-
[解決済み] Swift Betaのパフォーマンス:配列のソート
-
[解決済み] SwiftでUIAlertViewを作成するにはどうしたらいいですか?
-
[解決済み] Swiftのクラスにおける静的関数/変数とクラス関数/変数?
-
[解決済み] SwiftでStringのサブストリングはどのように動作するか
-
[解決済み] registerForRemoteNotificationTypes: は iOS 8.0 以降でサポートされていません。
-
[解決済み】なぜ、Swiftの文字列では、?のような絵文字が奇妙に扱われるのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】開発者の身元が確認できないため開けない
-
[解決済み】Objective-C。NULL、nil、@""の違いは何ですか?
-
[解決済み] .02fと%.2fの違いは何ですか?
-
[解決済み] Objective-Cのnil、NIL、nullの違いについて
-
[解決済み] Objective-Cで乱数を発生させる
-
[解決済み] CocoaPodsを使用している場合、.gitignoreには何が入るのでしょうか?
-
[解決済み】Cocoaでスタックトレースをコンソール/ログに出力するにはどうすればいいですか?
-
[解決済み】コンパイルの警告:アーキテクチャi386のファイルを処理するルールがない
-
[解決済み】UITableViewからセパレータラインを削除する方法はありますか?
-
[解決済み] registerForRemoteNotificationTypes: は iOS 8.0 以降でサポートされていません。