【发布时间】:2015-10-27 16:20:30
【问题描述】:
情况有点复杂。我有一个 Swift 项目,我已经将一些 Objective-C 文件导入到这个项目中。现在,我想在这些 Objective-C 文件中使用一些 Swift 类。该怎么做?
【问题讨论】:
标签: ios objective-c swift
情况有点复杂。我有一个 Swift 项目,我已经将一些 Objective-C 文件导入到这个项目中。现在,我想在这些 Objective-C 文件中使用一些 Swift 类。该怎么做?
【问题讨论】:
标签: ios objective-c swift
这个参考似乎涵盖了所有内容:
具体来说:
将 Swift 导入 Objective-C
当你将 Swift 代码导入到 Objective-C 中时,你依赖于一个 Xcode 生成的头文件将这些文件公开给 Objective-C。这 自动生成的文件是一个 Objective-C 头文件,它声明 目标中的 Swift 接口。它可以被认为是一个 Swift 代码的伞头。此标题的名称是您的 产品模块名称后跟“-Swift.h”。 (你会学到更多 关于产品模块名称,请在命名您的产品模块中。)
例子:
Foo.swift 在名为 ExampleProduct
的产品中@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() 甚至更容易。
来回跳跃没有限制。
根据 cmets,您似乎无法导入反向桥接头。
在终端中尝试此操作以确保您正确命名文件:
% 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 票值得研究!
【讨论】: