[英]Namespace conflict on bridging header and framework with swift and objective-c
[英]Swift framework - Objective-C header not found
我在Swift
创建了一个小型测试框架。 我的目的是在Objective-C
类中使用Swift
类。 我创建了一个Swift
文件。 然后是一个Objective-C
文件。 我确保构建设置中的Objective-C
标头是Test-Swift.h
当我尝试在目标C文件中导入Test-Swift.h时,出现错误-
找不到“ Test-Swift.h”文件。
迅捷类:
import Foundation
@objc class MyTest: NSObject {
func addTest() {
print("test")
}
}
Objective-C课程:
#import "YourTest.h"
#import <Test/Test-Swift.h>
#import "Test-Swift.h" // Error in this line
@implementation YourTest
-(void)testTest {
// This is how I want to use the swift class
MyTest *test = [MyTest new];
[test addTest];
}
@end
框架头:
#import <UIKit/UIKit.h>
//! Project version number for Test.
FOUNDATION_EXPORT double TestVersionNumber;
//! Project version string for Test.
FOUNDATION_EXPORT const unsigned char TestVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import <Test/PublicHeader.h>
构建设置(objective-C标头):
我已将“ 定义模块 ”设置为“ 是”
在框架目标中导入Swift代码的语法是
#import <ProductName/ProductModuleName-Swift.h>
在你的情况下可能是
#import <Test/Test-Swift.h>
实际上,这行出现在您的示例中,并且编译器显然没有抱怨它。 参见https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c 。
另一个问题是,鉴于Swift声明,您将无法以尝试的方式使用Swift类。 根据以上参考,Swift声明将需要具有public
或open
访问修饰符,以便通过-Swift.h
接口标头可见。 您还需要使Objective-C中的addTest()
函数可调用,因此在其前面需要@objc
。 因此,您的Swift代码应该像这样更改:
@objc public class MyTest: NSObject {
@objc public func addTest() {
print("test")
}
}
基于上面引用的相同文档,您可以通过删除public
来使框架之外的Objective-C代码访问addTest()
更加困难:
@objc func addTest()...
( @objc
,您仍然需要@objc
)。
然后,在Objective-C类中,您可以执行以下操作:
[test performSelector:@selector(addTest)];
但是,框架之外的任何代码都可以做同样的事情。
另一个观察结果是,在示例中导致错误的代码行(即#import "Test-Swift.h"
)是将接口标头包含在应用程序目标中而不是框架中的一种方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.