当前位置: 首页 > 面试题库 >

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

赏育
2023-03-14
问题内容

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

问题答案:

如果"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];


 类似资料:
  • 问题内容: 我开始学习Swift,并且一直在YouTube上观看斯坦福大学的精彩视频讲座。如果您有兴趣或有帮助,可以使用以下链接(尽管不需要了解我的问题): 使用Swift开发iOS 8应用-2。更多Xcode和Swift,MVC 在听完讲座之后,我发现(据我所知)我的代码与视频中的代码相同,但是在我的系统上,我遇到了编译器错误。经过大量的试验和错误,我设法将代码简化为两个示例,其中一个生成错误,

  • 为什么这在《雨燕3》中行不通?它会在运行时崩溃,并表示: “-[MY_APP_NAME.DisplayOtherappSCTRL TAP:]:无法识别的选择器已发送到实例0x17ECEB70”

  • 问题内容: 我刚刚发现了此功能。 使用“ @interface”语法声明接口可让您输入默认值。 对我来说这是新事物。该默认值应该如何使用。 我找不到对此的引用,因为Java 1.5中“ @”添加之前,www充满了Java接口文档(是.5还是.4中的?) 编辑 感谢您的回答(我已经有点接近“注释”了,因为我已经使用了标签):P 我知道我应该在多年前阅读该文件!!! 许多API需要大量样板代码。 对于

  • 问题内容: Xcode更新后,编译器开始在工作代码上引发错误(两个函数都在AppDelegate.swift中)。 有错误: /Users/../AppDelegate.swift:14:11:方法“ application( :didFinishLaunchingWithOptions :)” 提供的Objective-C方法“ application:didFinishLaunchingWit

  • 我有重复的变量声明,我认为它们可以通过for循环来改进,但是我的尝试失败了。 我尝试了数组的for-loop声明器,但我的语法不起作用。 我有一个“工作代码”: 我试图减少它是这样的: 预期结果: 与“工作代码”相同的结果: 当我单击“menu1”div时: 实际错误消息:“意外标记=”“未捕获的TypeError:菜单[0][i].AddEventListener不是函数” 编辑:我发现了一个巨

  • 我已经看过这些帖子: 谷歌云数据流 - 从Pub到镶木地板 谷歌数据流“工作流程失败”无缘无故 它们很有帮助,我最终为发布/订阅消息创建了类似的东西,比如:<code>{“id”:“1”}</code>(仅用于测试): 我只能看到错误“工作流失败”。但仅对于DataflowRunner,对于DirectRunner,我没有问题。这里是“运行”命令: 以下是此作业的日志(前几行是最后出现的): 现在