Xcode 7プロジェクトでObj-CとSwiftをうまく組み合わせて一致させています。しかし、Objective Cクラスで=から継承する方法を理解できないようです。 Swift class(そして、はい、私はそのSwift classを@objc
として可視性のために宣言することを知っています。)この場合、望ましいSwiftスーパークラスMySwiftViewController
はUIViewController
のサブクラスです。今のところ、Obj-Cでは、UIViewController
から直接継承しており、機能Iにアクセスできません。 MySwiftViewController
に追加されました。
これが私が理解していることです:
-何かから継承するものとしてObj-Cクラスを宣言するには、「:」の後の.hファイルにある必要があります。
#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end
-Swiftクラスを表示するには、つまり#import
ed:
#import "MyProject-Swift.h"
ただし、Swift自動生成されたブリッジングヘッダーをObj-C 。hファイルにインポートすることはできません。また、@class
。それで、これは可能ですか?
残念ながら、Objective-CでSwiftクラスをサブクラス化することはできません。ドキュメントから直接:
Objective-CでSwiftクラスをサブクラス化することはできません。
Objective-Cでアクセスできるものとできないものの詳細については、Appleの 相互運用性に関するガイド を参照してください。
Xcode 8.0以前については、ダーティーハックソリューションがありますが、これはおそらく将来修正される予定です。
Swiftファイルからサブクラス化する場合は、objc_subclassing_restricted
属性。便宜上、マクロとして作成できます。コード:
スウィフトクラス。
import Foundation
class SwiftClass : NSObject {
func say() {
print("hi");
}
}
Objcクラス:
#import <Foundation/Foundation.h>
#import "test-Swift.h"
#define Swift_SUBCLASS __attribute__((objc_subclassing_restricted))
Swift_SUBCLASS
@interface ObjcClass : SwiftClass
- (instancetype)init;
@end
@implementation ObjcClass
- (void)say {
NSLog(@"oops");
}
@end
しかし、私が理解しているように、これはサポートされておらず、そのために何らかのバグが発生する可能性があります。したがって、アクションのガイドではなく、もっと知りたい好奇心が強いもののように。