使用 Swift 代码的 Objective C 测试类

Objective C test class using Swift code

提问人:Morniak 提问时间:6/23/2014 最后编辑:Morniak 更新时间:11/21/2014 访问量:2333

问:

我的文件夹中有一个 swift 协议。 我创建了一个在文件夹中命名的 objective-c 单元测试类。 要进行一些测试,必须实现该协议。IModelIdProviderMyProjectNameRemoteModelFactoryTestMyProjectNameTestsRemoteModelFactoryTestIModelIdProvider

当我在 objective-c 类中使用我的 swift 协议时,我得到一个 .#import "MyProjectName-Swift.h"file not found

如果我将指令更改为 ,则找到标头,但找不到我的协议(它是在项目中定义的,而不是在项目中定义的)。#import#import "MyProjectNameTests-Swift.h"MyProjectNameMyProjectNameTests

在使用 Swift 代码的项目中有什么特别的事情要做吗?*Tests

iOS系统 Objective-C Swift Xcode6

评论

2赞 SushiGrass Jacob 6/23/2014
Swift 文件是否针对测试捆绑包?
0赞 Abhi Beckert 6/23/2014
当前的 swift 文档要么是错误的,要么是 Xcode 中存在错误。为了找到该文件,您必须在生成设置中定义“产品模块名称” - 将其设置为“MyProjectName”,您的导入应该可以工作。
0赞 Drux 1/24/2015
@AbhiBeckert 我尝试按照您的建议更改产品模块名称(请参阅此处),但到目前为止这没有帮助。你真的尝试过这个食谱吗?
0赞 Drux 1/24/2015
@Morniak 您是否能够解决这个问题(请参阅此处)?
0赞 Abhi Beckert 1/25/2015
@Drux这个问题已经有 6 个月了,从那时起 Swift 发生了很大变化,所以它可能已经过时了。几个月前,我发布的内容确实对我有用。我现在不知道它是如何工作的。

答:

-1赞 Nikolai Nagornyi 6/23/2014 #1

要在与 Swift 代码相同的框架目标中导入一组 Objective-C 文件,您需要将这些文件导入到框架的 Objective-C 总标题中。

将 Swift 代码从同一框架导入 Objective-C

在“生成设置”下的“打包”中,确保该框架目标的“定义模块”设置设置为“是”。 使用此语法将该框架目标中的 Swift 代码导入到该框架目标中的任何 Objective-C .m 文件中,并替换适当的名称...

https://developer.apple.com/library/prerelease/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

评论

2赞 Jean Lebrument 6/25/2014
我认为这不会解决@Morniak遇到的问题。他说他想在 Obj-C 单元测试中使用 Swift 文件。Project-TargetProjectTest-Target
1赞 Bartosz Hernas 11/21/2014 #2

我知道它的额外黑客和一切,但我所做的和它的工作是从生成的“Project-Swift.h”中复制公共标头并将需要的内容粘贴到测试的 .m 文件中。

所以我复制了这样的东西:

SWIFT_CLASS("_TtC10Inventorum11ImageEntity")
@interface ImageEntity : NSObject <FICEntity>
@property (nonatomic, copy) NSString * imageID;
@property (nonatomic) NSURL * retinaImageURL;
@property (nonatomic) NSURL * nonRetinaimageURL;
@property (nonatomic, readonly) NSURL * imageURL;
@property (nonatomic, readonly, copy) NSString * UUID;
@property (nonatomic, readonly, copy) NSString * sourceImageUUID;
@property (nonatomic) RACSignal * rac_signalForImage;
- (instancetype)init OBJC_DESIGNATED_INITIALIZER;
- (NSURL *)sourceImageURLWithFormatName:(NSString *)formatName;
- (FICEntityImageDrawingBlock)drawingBlockForImage:(UIImage *)image withFormatName:(NSString *)formatName;
- (void)objc_setType:(NSString *)type;
@end

最重要的是,我还复制了SWIFT_CLASS等的所有宏。我的测试正在构建并通过测试 Swift 代码。

顺便说一句。别忘了公开 Swift 中经过测试的类和方法。