Не удается увидеть переменную / метод Swift в Objective C - PullRequest
0 голосов
/ 11 сентября 2018

Я не могу увидеть метод / переменную для установки myVar в true из Objective C, даже если я добавил модификаторы @objc и public и в * 1006 нет Bool* подпись метода.

Это, вероятно, вызвано разницей между Bool Swift и Objective C BOOL.

Видны другие методы / переменные класса, только этот конкретный не.

Как можно установить Bool Свифта из Objective C?

Код Swift:

public class MyViewController : UIViewController {
    public var myVar:Bool = false

    @objc public func setMyVarTrue() {
        self.myVar = true
    }
}

Код Objective C:

MyViewController* myViewController = [MyViewController new];
myViewController.myVar = true // Variable not found
myViewController.setMyVarTrue() // Method not found
[self presentViewController:myViewController animated:NO completion:nil];

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Решением было очистить и перестроить проект. Xcode автоматически генерирует заголовок быстрого моста, и в моем случае он останавливал процесс сборки с ошибкой (переменная / метод не найден) перед созданием заголовка моста.

SWIFT_CLASS("_TtC11MyProject25MyViewController")
@interface MyViewController : UIViewController
@property (nonatomic, strong) MBProgressHUD * _Nonnull progressIndicator;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)submitProgressHandler:(NSNotification * _Nonnull)notification;
- (void)submitSuccessHandler;
- (void)submitFailureHandler:(NSNotification * _Nonnull)notification;
- (void)subscribe;
- (void)unsubscribe;
@end

Теперь все отлично работает:

SWIFT_CLASS("_TtC11MyProject25MyViewController")
@interface MyViewController : UIViewController
@property (nonatomic, strong) MBProgressHUD * _Nonnull progressIndicator;
@property (nonatomic) BOOL closing;
- (nonnull instancetype)initWithNibName:(NSString * _Nullable)nibNameOrNil bundle:(NSBundle * _Nullable)nibBundleOrNil OBJC_DESIGNATED_INITIALIZER;
- (nullable instancetype)initWithCoder:(NSCoder * _Nonnull)aDecoder OBJC_DESIGNATED_INITIALIZER;
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)setClosingTrue;
- (void)submitProgressHandler:(NSNotification * _Nonnull)notification;
- (void)submitSuccessHandler;
- (void)submitFailureHandler:(NSNotification * _Nonnull)notification;
- (void)subscribe;
- (void)unsubscribe;
@end
0 голосов
/ 11 сентября 2018

Вы должны сделать

  1. добавить @objc к объявлению вашего класса

  2. добавить файл с именем "yourName-swift.h", который должен содержать @class yourClass;

  3. импортировать "yourName-swift.h" в файл Objective C, куда вы хотите позвонить

ваш быстрый класс

...