Отсутствие видимого @interface для MySwiftFile объявляет селектор «****» в среде iOS

У меня возникли проблемы с использованием Swift в рамках ObjC в iOS. В моей структуре есть код Objective-C, из которого я хочу вызвать код Swift.

Я думаю, что создал мост правильно, я покажу ниже, что я сделал.

MySwiftFile.swift :

open class MySwiftFile: NSObject {
  var varDummy : RandomType? = nil
  open func setupDummy(param1 : RandomType1) {
    varDummy = RandomType(p: param1)
  }
}

MyObjCFile.m :

@class MySwiftFile;
#import "MyFramework/MyFramework-Swift.h"

@interface A : NSObject<...>
@property(atomic) MySwiftFile *mySwiftFile;

.....
@end
@implementation Aclass
......
@end

@interface B ()
....
@property(readonly, nonatomic) A *refA;
@end

@implementation B
....
- (void)methodCalledSomewhere:(RandomType1 *)type {
   ....
   refA.mySwiftFile = [[MySwiftFile alloc] init];
   [refA.mySwiftFile setupDummy: type];   <====THIS LINE PRODUCES THE ERROR
}
....

Подводя итог, я хочу инициализировать свойство и вызвать функцию объекта Swift из кода ObjC. Xcode, похоже, распознает MySwiftFile как допустимый тип, но почему он не позволяет мне вызывать метод setupDummy?

Ошибок 2:

  • Отсутствие видимого @interface для «MySwiftFile» объявляет селектор «setupDummy:»
  • Отсутствие видимого @interface для MySwiftFile объявляет селектор setupDummy.

person fff    schedule 01.07.2020    source источник
comment
RandomType1 вероятно недоступен из ObjC.   -  person user28434'mstep    schedule 01.07.2020
comment
Ваш класс MySwiftFile не подвергается воздействию среды выполнения Obj-C. Найдите @objc, @objcMembers, ... Я не могу найти лучший ответ, чтобы пометить это как дубликат, но их много.   -  person zrzka    schedule 01.07.2020
comment
@user28434 user28434 Была опечатка, только что исправил   -  person fff    schedule 01.07.2020
comment
@zrzka Не получилось добавить @objc или @objcMembers. Возникает та же ошибка: нет видимого @interface для «MySwiftFile», объявляет селектор «setupDummy:»   -  person fff    schedule 01.07.2020


Ответы (1)


Первая проблема заключается в том, что вы забыли открыть его для Objective-C. Либо добавить @objcMembers, чтобы выставить все...

@objcMembers
open class MySwiftFile: NSObject {
    ...
}

... или просто добавьте @objc к вашей функции setupDummy...

@objc
open func setupDummy(param1: String) {
    ...
}

Вторая проблема связана с тем, как имя функции переводится в Objective-C...

  • @objc func setupDummy(param1 : RandomType1) -> setupDummyWithParam1:
  • @objc func setupDummy(_ param1: RandomType1) -> setupDummy:
  • @objc(setupDummy:) func setupDummy(param1: String) -> setupDummy:

... это означает, что добавление только @objc не сработает. Вы должны либо изменить сигнатуру функции Swift, либо использовать setupDummyWithParam1: в своем Objective-C, либо сохранить сигнатуру функции Swift и использовать @objc(<name>) для изменения селектора Objective-C.

person zrzka    schedule 01.07.2020
comment
Спасибо, тем временем я проверил в файле MyProj-Swift.h и, действительно, там была объявлена ​​функция setupDummyWithParam1. Ваше здоровье - person fff; 02.07.2020