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

Posted

技术标签:

【中文标题】Objective-c 中的 swift 3 方法失败,没有可见的 @interface for \'MySwiftClass\' 声明选择器 \'addX:andY\'【英文标题】:swift 3 method in objective-c fails with no visible @interface for 'MySwiftClass' declares the selector 'addX:andY'Objective-c 中的 swift 3 方法失败,没有可见的 @interface for 'MySwiftClass' 声明选择器 'addX:andY' 【发布时间】:2016-12-10 20:40:31 【问题描述】:

我们正在尝试在 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-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'

【问题讨论】:

定义...andY...和调用...addY...不同。 请解释一下。 addY: != andY: 甚至主题中的错误信息和代码中的不一样 【参考方案1】:

如果您在 Xcode 中通过命令单击 "ProductModuleName-Swift.h" 源文件编辑器,然后您可以看到 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 已经是第一个的参数(外部)名称 范围。您还可以在 Swift 定义中添加 @objc() 属性 控制 Objective-C 名称。例如,与

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

它会被 Objective-C 调用为

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

【讨论】:

“ProductModuleName-Swift.h”上的命令点击提示非常有用。我仍在为如何从目标 c++ 访问静态 swift 函数而苦苦挣扎 作为一个更新,在 Swift 4 中,我们现在需要在每个 Swift 函数前面加上 @objc,以便让 Objective-C 可用;包括对象变量。 我也面临同样的问题:'EvrythngHelper' 没有可见的@interface 声明选择器&我正在使用 swift 4,并尝试在目标 c++ 类中使用 swift 代码 这个技巧是纯金的!谢谢。 在导航器和查找器中都找不到“ProductModuleName-Swift.h”文件!?谁能告诉我在哪里 CMD + 点击查看文件!?谢谢!!!【参考方案2】:

正如@ekscrypto 指出的那样,在 Swift 4 及更高版本中,您需要使用 @objc 注释各个函数。在此之前,单个类级别的@objc 就足够了。 当然,在 Objective-C 类中,您必须添加 NAME_PROJECT-swift.h 的导入。 如果您的项目名称是 Sample 那么您必须添加:

#import Sample-swift.h

然后:

Swift 4 或更低版本

@objc class MySwiftClass: NSObject 
    
    func sayHello()
      //function
    

    func addX()
      //function
    

Swift 4 或更高版本

@objc class MySwiftClass: NSObject 
    
    @objc func sayHello()
      //function
    

    @objc func addX()
      //function
    

【讨论】:

@objc 是解决这个问题的关键。【参考方案3】:

就我而言,我忘了添加:

#import "MyProject-Swift.h"

进入obj c文件。

【讨论】:

以上是关于Objective-c 中的 swift 3 方法失败,没有可见的 @interface for 'MySwiftClass' 声明选择器 'addX:andY'的主要内容,如果未能解决你的问题,请参考以下文章

Swift 中的 Objective-C 方法参数

如何将此方法从 Objective-C 转换为 Swift?

什么是与Objective-C中的getConstraintForFirstItem等效的swift方法

Swift与Objective-C中的命名方法

转换为 Swift 3 重命名了我自己的 Objective-C 方法

Objective-C:Swift Package 函数中的多参数方法语法