web-dev-qa-db-ja.com

Objective CのSwiftクラスから継承

Xcode 7プロジェクトでObj-CとSwiftをうまく組み合わせて一致させています。しかし、Objective Cクラスで=から継承する方法を理解できないようです。 Swift class(そして、はい、私はそのSwift classを@objcとして可視性のために宣言することを知っています。)この場合、望ましいSwiftスーパークラスMySwiftViewControllerUIViewControllerのサブクラスです。今のところ、Obj-Cでは、UIViewControllerから直接継承しており、機能Iにアクセスできません。 MySwiftViewControllerに追加されました。

これが私が理解していることです:

-何かから継承するものとしてObj-Cクラスを宣言するには、「:」の後の.hファイルにある必要があります。

#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@end

-Swiftクラスを表示するには、つまり#imported:

#import "MyProject-Swift.h"

ただし、Swift自動生成されたブリッジングヘッダーをObj-C 。hファイルにインポートすることはできません。また、@class。それで、これは可能ですか?

20
BaseZen

残念ながら、Objective-CでSwiftクラスをサブクラス化することはできません。ドキュメントから直接:

Objective-CでSwiftクラスをサブクラス化することはできません。

Objective-Cでアクセスできるものとできないものの詳細については、Appleの 相互運用性に関するガイド を参照してください。

44
Edward Jiang

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

しかし、私が理解しているように、これはサポートされておらず、そのために何らかのバグが発生する可能性があります。したがって、アクションのガイドではなく、もっと知りたい好奇心が強いもののように。

3
Alfred Zien