Swift框架-找不到Objective-C标头

时间:2018-10-08 13:08:27

标签: ios objective-c swift swift-framework

我在.mat中创建了一个小型测试框架。我的目的是在savemat类中使用Swift类。我创建了一个Swift文件。然后是一个Objective-C文件。我确保 Build Settings 中的Swift标头是 Test-Swift.h
尝试在目标C文件中导入Test-Swift.h时,出现错误-

  

找不到“ Test-Swift.h”文件。

快速班:

Objective-C

Objective-C类:

Objective-C

框架标题:

import Foundation

@objc class MyTest: NSObject {
    func addTest()  {
        print("test")
    }
}  

构建设置(objective-C标头):

Strings in HDF5

我已将定义模块设置为

1 个答案:

答案 0 :(得分:1)

在框架目标中导入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声明将需要具有publicopen访问修饰符,才能通过-Swift.h接口头显示。您还需要使addTest()函数可从Objective-C调用,因此需要在其前面使用@objc。因此,您的Swift代码应该像这样更改:

@objc public class MyTest: NSObject {
    @objc public func addTest()  {
        print("test")
    }
}  

基于上述相同的文档,您可以通过删除addTest()使框架之外的Objective-C代码访问public更加困难:

@objc func addTest()...

(尽管您仍然需要@objc)。

然后在您的Objective-C类中可以做到:

[test performSelector:@selector(addTest)];

但是,框架之外的任何代码都可以做同样的事情。

另一个观察结果是,在示例中导致错误的代码行#import "Test-Swift.h"是一种将接口标头包含在应用程序目标中而不是框架中的方法。