无法在 Objective-C .m 文件中调用 Swift 方法

Posted

技术标签:

【中文标题】无法在 Objective-C .m 文件中调用 Swift 方法【英文标题】:Cannot call Swift method in Objective-C .m file 【发布时间】:2017-12-31 13:33:31 【问题描述】:

我的代码的一部分有很大问题。 我的 ViewController.swift 文件中有简单的功能(结束):

ViewController.swift

@objc class Constant: NSObject 
 override init() 

 @objc class func parseApplicationId() -> String  return "lol" 
 @objc func printSome()  print("teeeeest") 

现在我有一个用 Objective-C 编写的 pod(图表图形)。所以我创建了名为:

的桥接文件

myprojectname-Swift.h

#import "EColumnChartViewController.h"

在Objective-C文件的头文件中:

HEADER.h

#import <UIKit/UIKit.h>
#import "EColumnChart.h"
#import "myprojectname-Swift.h"

@class Constant;

@interface Constant : NSObject

-(void)printSome;

@end

在我的 FILE.m 中有这个:

#import "myprojectname-Swift.h"

- (void)viewDidLoad

    [super viewDidLoad];


    Constant * sis = [[Constant alloc] init];
    [sis printSome];

我的问题是:

当我构建项目时,Xcode 调用我错误:

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_Constant", referenced from:
      objc-class-ref in EColumnChartViewController.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我想解决的问题:

新建桥接文件 关闭构建设置的某些部分 @implementation 常量 -> 线程 1 错误

我只想将 Swift 函数调用到 Objective-C 文件中(轻松调用打印控制台)。感谢您的每一个想法。

遗言:我在 *** 上查看了很多帖子。

【问题讨论】:

你的 podfile 中有这行吗? use_frameworks 是的,我有。使用框架! @emololftw :为了访问 Objective-C 文件中的 swift 文件,您需要使用 #import "your_project-Swift.h" 在您的 Objective-C .m 文件中导入 project-swift.h 文件而不是桥接头 桥接头里面必须有什么?我有 myprojectname-Swift.h 作为桥接。所以它的方法不正确? @emololftw :你的代码伙伴有很多问题。桥接头将只有对目标 C 文件的 .h 的导入语句,没有别的。由于 project-Swift.h 是自动生成的,您无需向其中添加任何内容,您唯一的工作就是确保创建文件并确保它具有您希望在目标中访问的 swift 文件的引用-C 文件。最后,您无需再次在objective-C文件中声明接口Constant:NSObject,只需将其删除 【参考方案1】:

重复的类

主要问题似乎是您创建了两个名为 Constant 的类:一个在 Swift 中,另一个在 Objective-C 中。您只能拥有一个具有给定名称的类。

@objc class Constant: NSObject@interface Constant : NSObject 都创建了同一个类。重命名其中之一。

可能不正确的桥接

Swift 桥接头很特别。你不能只创建一个头文件并期望它在 Swift 中工作。

确保在 Xcode 中正确设置桥接头。

    单击顶部的项目打开配置屏幕 搜索SWIFT_OBJC_BRIDGING_HEADER 确保值指向您的桥接头。例如:myprojectname/myprojectname-Bridging-Header.h 在桥接头文件中,为您希望 Swift 能够使用的类放入 Objective-C 导入:#import "EColumnChartViewController.h"

其他问题

HEADER.h:

    删除@class Constant;。这对你没有任何帮助。 将 EColumnChart.h 和 myprojectname-Swift.h 的 #import 移动到 .m 文件中FILE.m 应该有一个#import HEADER.h。每个 .m 都必须导入它的 .h!

@objc class Constant: NSObject 行上,删除@objc... 这显然是Objective-C,因为它扩展了NSObject

正如一些评论者所说,您提供的代码存在大量问题。你真的应该先花时间学习 Objective-C 和/或 Swift。首先观看一些免费的 WWDC 视频或谷歌搜索 ios 简介。

【讨论】:

【参考方案2】:

上面一步一步做

你使用上面的@objcMembers在swift文件中声明类。

.m 文件中导入&lt;"Your_Project"&gt;-Swift.h

objcMembers 
class ObjectA: NSObject 
   .....

【讨论】:

以上是关于无法在 Objective-C .m 文件中调用 Swift 方法的主要内容,如果未能解决你的问题,请参考以下文章

NSStringto类成员分配崩溃

iOS Objective-C这样和CC++进行混编

Objective-C学习笔记-第一天

Objective-C语法汇总

Objective-C中.h文件.m文件中@interface@synthesize及其它

用于单元测试 Objective-C XCTest 的 .m 文件中的访问变量定义