情况有点复杂。我有一个Swift项目,我已经将一些Objective-C文件导入到这个项目中。现在,我想在这些Objective-C文件中使用一些Swift类。怎么做?
答案 0 :(得分:2)
这个参考文献似乎涵盖了所有内容:
具体做法是:
将Swift导入Objective-C
当您将Swift代码导入Objective-C时,您依赖于 Xcode生成的头文件将这些文件暴露给Objective-C。这个 自动生成的文件是一个声明的Objective-C头 目标中的Swift接口。它可以被认为是一种 你的Swift代码的标题。这个标题的名称是你的 产品模块名称后跟添加" -Swift.h"。 (你会了解更多 有关产品模块名称,请参阅命名产品模块。)
示例:
名为 ExampleProduct
的产品中的Foo.swift@objc public class Bar: NSObject {
var x: Int = 3
}
Blah.m在同一产品中:
#import <Foundation/Foundation.h>
#import <ExampleProduct-Swift.h>
void doStuff() {
Bar *y = [[Bar alloc] init];
printf("%ld\n", (long)y.x);
}
如果您创建一个定义函数原型的Objective-C头文件,然后在桥接头中导入该头文件,那么从Swift文件调用doStuff()
甚至更容易。
来回跳跃是没有限制的。
根据评论,您似乎无法导入反向桥接标头。
在终端中尝试此操作以确保您正确命名文件:
% cd ~/Library/Developer/Xcode; find . -name '*-Swift.h'
我得到(向右滚动):
./DerivedData/ExampleProduct-avoxifngmebkkqgndldocildsfcm/Build/Intermediates/ExampleProduct.build/Debug-iphonesimulator/ExampleProduct.build/DerivedSources/ExampleProduct-Swift.h
./DerivedData/ExampleProduct-avoxifngmebkkqgndldocildsfcm/Build/Intermediates/ExampleProduct.build/Debug-iphonesimulator/ExampleProduct.build/Objects-normal/x86_64/ExampleProduct-Swift.h
./DerivedData/ExampleProduct-avoxifngmebkkqgndldocildsfcm/Build/Intermediates/ExampleProduct.build/Debug-iphonesimulator/ExampleProductTests.build/DerivedSources/ExampleProductTests-Swift.h
./DerivedData/ExampleProduct-avoxifngmebkkqgndldocildsfcm/Build/Intermediates/ExampleProduct.build/Debug-iphonesimulator/ExampleProductTests.build/Objects-normal/x86_64/ExampleProductTests-Swift.h
此外,可能是重复:
How to call Objective-C code from Swift
有326个值得研究的赞成票!