swift 3 method in objective-c fails with no visible @interface for 'MySwiftClass' declares the selector 'addX:andY'
If you command-click on "ProductModuleName-Swift.h"
in the Xcode
source file editor then you can see how the Swift methods are mapped to Objective-C.
In your case that would be
@interface MySwiftClass : NSObject
- (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (void)sayHello;
- (NSInteger)addXWithX:(NSInteger)x andY:(NSInteger)y;
@end
which is called as
MySwiftClass* getData = [[MySwiftClass alloc]init];
[getData sayHello];
NSInteger result = [getData addXWithX:5 andY:5];
A better Swift 3 method name might be
func add(x: Int, y:Int) -> Int
because x
is already the argument (external) name of the first
parameter. You can also add an @objc()
attribute to the Swift definition
to control the Objective-C name. For example, with
@objc(addX:andY:)
func add(x: Int, y: Int) -> Int {
return x+y
}
it would be called from Objective-C as
NSInteger result = [getData addX:5 andY:5];
As ekscrypto in Swift 4 or later all functions need @objc
if you use less versión than Swift 4 is enough @objc
in class.
Of course in Objective-C class you must add import of NAME_PROJECT-swift.h
.
If your project name is Sample then you must add:
#import Sample-swift.h
And then:
Swift 4 or Less
@objc class MySwiftClass: NSObject {
func sayHello(){
//function
}
func addX(){
//function
}
}
Swift 4 or Greater
@objc class MySwiftClass: NSObject {
@objc func sayHello(){
//function
}
@objc func addX(){
//function
}
}
In my case I had forgotten to add:
#import "MyProject-Swift.h"
Into the obj c file.