我的一部分代码有很大问题。 我的 ViewController.swift 文件中有简单的功能(最后):
ViewController.swift
@objc class Constant: NSObject {
override init() {}
@objc class func parseApplicationId() -> String { return "lol" }
@objc func printSome() { print("teeeeest") }
}
现在我有一个 pod(图表图形)是用 Objective-C 编写的。所以我创建了桥接文件:
我的项目名-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)
我想解决的问题:
- 新桥接文件
- 关闭build设置的某些部分
- @implementation Constant -> 线程 1 错误
我只想将 Swift 函数调用到 Objective-C 文件中(轻松调用打印控制台)。感谢您的每一个想法。
最后的话:我在 Stackoverflow 上查看了很多帖子。
最佳答案
重复类
主要问题似乎是您创建了两个名为 Constant
的类:一个在 Swift 中,另一个在 Objective-C 中。您只能拥有一个具有给定名称的类(class)。
这个@objc class Constant: NSObject
和@interface Constant : NSObject
都创建了同一个类。重命名其中之一。
可能桥接不正确
Swift 桥接 header 很特别。您不能只创建一个头文件并期望它在 Swift 中工作。
确保在 Xcode 中正确设置了桥接头。
- 点击顶部的项目打开配置屏幕
- 搜索
SWIFT_OBJC_BRIDGING_HEADER
- 确保该值指向您的桥接头。例如:
myprojectname/myprojectname-Bridging-Header.h
- 在桥接头文件中,为您希望 Swift 能够使用的类放置 Objective-C 导入:
#import "EColumnChartViewController.h"
其他问题
在 HEADER.h
中:
- 删除
@class常量;
。这对您没有任何帮助。 - 将 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 介绍。
关于ios - 无法在 Objective-C .m 文件中调用 Swift 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48042893/