在objective-c中的swift 3方法失败,没有可见的@interface为'MySwiftClass'声明选择器'addX:andY'

com*_*exi 21 objective-c swift

我们试图在objective-c实现中引用swift方法.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

Objective-C实现(Objective-cm):

#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'
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 32

如果"ProductModuleName-Swift.h"在Xcode源文件编辑器中按住Command键单击,则可以看到Swift方法如何映射到Objective-C.

在你的情况下,将是

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

被称为

MySwiftClass* getData = [[MySwiftClass alloc]init];
[getData sayHello];
NSInteger result = [getData addXWithX:5 andY:5];
Run Code Online (Sandbox Code Playgroud)

一个更好的Swift 3方法名称可能是

func add(x: Int, y:Int) -> Int
Run Code Online (Sandbox Code Playgroud)

因为x已经是第一个参数的参数(外部).您还可以@objc()向Swift定义添加属性以控制Objective-C名称.例如,用

@objc(addX:andY:)
func add(x: Int, y: Int) -> Int {
    return x+y
}
Run Code Online (Sandbox Code Playgroud)

它将从Objective-C调用为

NSInteger result = [getData addX:5 andY:5];
Run Code Online (Sandbox Code Playgroud)

  • 作为更新,在Swift 4中,我们现在需要在@objc前面为Objective-C提供的每个Swift函数; 包括对象变量. (28认同)

Jos*_*e S 17

作为Swift 4或更高版本中的ekscrypto,@objc如果你使用比Swift 4更少的版本,那么所有函数都需要@objc在课堂上使用enoguh .