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

标签 ios objective-c swift xcode bridging-header

我的一部分代码有很大问题。 我的 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 中正确设置了桥接头。

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

enter image description here

其他问题

HEADER.h 中:

  1. 删除@class常量;。这对您没有任何帮助。
  2. 将 EColumnChart.h 和 myprojectname-Swift.h 的 #import 移动到 .m 文件中。
  3. 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/

相关文章:

ios - Firebase 运行时崩溃 - FIRInstanceIDConfig

ios - Swift 图片上传保存为 mime_type "data"

iOS APNS 开发 [沙盒] 与生产

ios - 在 iOS 和 Mac OS X 之间进行双向通信的最简单方法是什么?

objective-c - 使用Cocoa/Objective-C,在Mac OS X中获取当前连接网络的安全类型

iphone - 委托(delegate)是执行此操作的首选方法吗?

c - 简单的 Objective-C(适用于 C)控制台程序将华氏度转换为摄氏度,反之亦然

ios - swift 文件的路径扩展名和 MIME 类型

ios - 从 PHAsset 中提取元数据返回意外的 nil 值

IOS:关于将 subview (UIView)添加到 UIScrollView 实例中的问题