Метод swift 3 в objective-c не работает без видимого @interface для 'MySwiftClass' объявляет селектор 'addX: andY'

мы пытаемся ссылаться на быстрые методы внутри реализации objective-c.

Swift 3 Класс:

import Foundation
@objc class MySwiftClass: NSObject {
    override init() {
        super.init()
    }

    func sayHello() -> Void {
        print("hello");
    }

    func addX(x:Int, andY y:Int) -> Int {
     return x+y
    }
}

Objective-C реализация (Objective-c.m):

#import "ProductModuleName-Swift.h"
MySwiftClass* getData = [[MySwiftClass alloc]init];
[getData sayHello] //works
[getData addX:5 addY:5] //No visible @interface for 'MySwiftClass' declares selector 'addX:addY'

Ответ 1

Если вы нажмете команду "ProductModuleName-Swift.h" на Xcode редактор исходного файла, вы можете увидеть, как методы Swift сопоставляются с Objective-C.

В вашем случае это будет

@interface MySwiftClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (void)sayHello;
- (NSInteger)addXWithX:(NSInteger)x andY:(NSInteger)y;
@end

который называется

MySwiftClass* getData = [[MySwiftClass alloc]init];
[getData sayHello];
NSInteger result = [getData addXWithX:5 andY:5];

Лучшее имя метода Swift 3 может быть

func add(x: Int, y:Int) -> Int

потому что x уже является аргументом (внешним) именем первого параметр. Вы также можете добавить атрибут @objc() в определение Swift для управления именем Objective-C. Например, при

@objc(addX:andY:)
func add(x: Int, y: Int) -> Int {
    return x+y
}

он будет вызываться из Objective-C как

NSInteger result = [getData addX:5 andY:5];

Ответ 2

Как ekscrypto в Swift 4 или более поздней @objc всех функций требуется @objc если вы используете меньше versión, чем Swift 4, это enoguh @objc в классе.

Ответ 3

В моем случае я забыл добавить:

#import "MyProject-Swift.h"

В файл obj c.