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'的主要内容,如果未能解决你的问题,请参考以下文章
如何将此方法从 Objective-C 转换为 Swift?
什么是与Objective-C中的getConstraintForFirstItem等效的swift方法