一尘不染

Objective-C中的swift 3方法失败,“ MySwiftClass”没有可见的@interface声明选择器“ addX:andY”

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
    }
}

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'

阅读 262

收藏
2020-07-07

共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];
2020-07-07