Наследовать от класса Swift в Objective C

Я успешно смешиваю и сопоставляю Obj-C и Swift в проекте Xcode 7. Тем не менее, я не могу понять, как в классе Objective C наследовать от класса Swift (и да, я знаю, как объявить этот класс Swift как @objc для наглядности). В этом случае желаемый суперкласс Swift MySwiftViewController является подклассом UIViewController. На данный момент в Obj-C я наследую непосредственно от UIViewController и не получаю доступ к возможностям, которые я добавил в 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. Итак, возможно ли это и как?

12 голосов | спросил BaseZen 6 FebruaryEurope/MoscowbSat, 06 Feb 2016 21:12:51 +0300000000pmSat, 06 Feb 2016 21:12:51 +030016 2016, 21:12:51

2 ответа


0

К сожалению, невозможно создать подкласс класса Swift в Objective-C. Прямо из документов:

  

Вы не можете создать подкласс класса Swift в Objective-C.

См. руководство по взаимодействию для получения более подробной информации о том, что вы можете и не можете получить с помощью Objective-C.

ответил Edward Jiang 6 FebruaryEurope/MoscowbSat, 06 Feb 2016 21:19:53 +0300000000pmSat, 06 Feb 2016 21:19:53 +030016 2016, 21:19:53
0

Что касается Xcode 8.0 и более ранних версий, существует грязное решение, которое, вероятно, будет исправлено в будущем.

Если вы хотите создать подкласс из файла swift, вы можете добавить атрибут objc_subclassing_restricted. Вы можете сделать это как макрос для удобства. Код:

Swift class.

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

Но, насколько я понимаю, это не поддерживается, и у вас могут быть какие-либо ошибки из-за этого. Так что это не руководство к действию, а скорее любопытная вещь, которую нужно знать.

ответил Alfred Zien 13 +03002016-10-13T17:18:17+03:00312016bEurope/MoscowThu, 13 Oct 2016 17:18:17 +0300 2016, 17:18:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132