1

我在Swift. 我的目的是Swift在课堂上使用课堂Objective-C。我创建了一个Swift文件。然后是一个Objective-C文件。我确保Build SettingsObjective-C中的标头是Test-Swift.h 当我尝试在 Objective-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 标头):

在此处输入图像描述

我已将定义模块设置为

4

1 回答 1

2

在框架目标中导入 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)];

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

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

于 2018-10-09T01:43:06.520 回答