我正在为我的项目编写测试用例(XCTestCases),该项目混合了Obj-C和Swift代码。我可以用Swift语言为Objective C代码编写测试用例。但我无法访问Objective C测试文件中的Swift类。它显示编译器错误。
1.我已经将#import“MyProjectTests-Swift.h”文件导入到我的Objective C测试文件中。
1.对于测试目标,“启用可测试性”和“定义模块"设置为”是“
当我打开“MyProjectTests-Swift.h”文件时,我无法看到Obj C为Swift代码生成的声明。
我的代码
# import <XCTest/XCTest.h>
# import <OCMock/OCMock.h>
# import "MyProjectTests-Swift.h"
- (void)testExample {
MyController *myController= [[MyController alloc] init];
}
错误
1. Use of undeclared identifier 'MyController'
2. Use of undeclared identifier 'myController'
我的项目测试-Swift. h代码
// Generated by Apple Swift version 2.2 (swiftlang-703.0.18.8 clang-703.0.31)
# pragma clang diagnostic push
# if defined(__has_include) && __has_include(<swift/objc-prologue.h>)
# include <swift/objc-prologue.h>
# endif
# pragma clang diagnostic ignored "-Wauto-import"
# include <objc/NSObject.h>
# include <stdint.h>
# include <stddef.h>
# include <stdbool.h>
# if !defined(SWIFT_TYPEDEFS)
# define SWIFT_TYPEDEFS 1
# if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
# elif !defined(__cplusplus) || __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
# endif
typedef float swift_float2 __attribute__((__ext_vector_type__(2)));
typedef float swift_float3 __attribute__((__ext_vector_type__(3)));
typedef float swift_float4 __attribute__((__ext_vector_type__(4)));
typedef double swift_double2 __attribute__((__ext_vector_type__(2)));
typedef double swift_double3 __attribute__((__ext_vector_type__(3)));
typedef double swift_double4 __attribute__((__ext_vector_type__(4)));
typedef int swift_int2 __attribute__((__ext_vector_type__(2)));
typedef int swift_int3 __attribute__((__ext_vector_type__(3)));
typedef int swift_int4 __attribute__((__ext_vector_type__(4)));
# endif
# if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
# endif
# if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
# endif
# if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
# else
# define SWIFT_RUNTIME_NAME(X)
# endif
# if defined(__has_attribute) && __has_attribute(swift_name)
# define SWIFT_COMPILE_NAME(X) __attribute__((swift_name(X)))
# else
# define SWIFT_COMPILE_NAME(X)
# endif
# if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
# endif
# if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
# endif
# if !defined(SWIFT_ENUM_EXTRA)
# define SWIFT_ENUM_EXTRA
# endif
# if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted)
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# else
# define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# define SWIFT_CLASS_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
# endif
# if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# define SWIFT_PROTOCOL_NAMED(SWIFT_NAME) SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
# endif
# if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
# endif
# if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
# define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
# define OBJC_DESIGNATED_INITIALIZER
# endif
# endif
# if !defined(SWIFT_ENUM)
# define SWIFT_ENUM(_type, _name) enum _name : _type _name; enum SWIFT_ENUM_EXTRA _name : _type
# if defined(__has_feature) && __has_feature(generalized_swift_name)
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) enum _name : _type _name SWIFT_COMPILE_NAME(SWIFT_NAME); enum SWIFT_COMPILE_NAME(SWIFT_NAME) SWIFT_ENUM_EXTRA _name : _type
# else
# define SWIFT_ENUM_NAMED(_type, _name, SWIFT_NAME) SWIFT_ENUM(_type, _name)
# endif
# endif
# if defined(__has_feature) && __has_feature(modules)
# endif
# pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"
# pragma clang diagnostic ignored "-Wduplicate-method-arg"
# pragma clang diagnostic pop
我的控制器Swift类
import Foundation
class MyController: UIViewController, UITextFieldDelegate {
// Project specific logic
}
2条答案
按热度按时间de90aj5v1#
我发现了这个问题。测试目标中缺少桥接头(Swift Compiler - Code Generation -〉Objective-C桥接头)。我刚刚添加了桥接头并构建了项目。现在MyProjectTests-Swift. h显示了所有ObjectiveC生成的头声明。
希望这对遇到同样问题的人有帮助。
mznpcxlj2#
发现此问题是为了查找相关问题,为此我需要做一些其他事情来修复它:当您的应用使用Swift和Objective-C,并且您的测试目标也有混合语言时,您将需要在测试文件中编写以下代码,以便在ObjC测试中访问Swift类型:
如果这对您不起作用,那可能是因为测试目标无法找到应用目标的生成头。
溶液
新增
测试目标的 * 构建设置〉标头搜索路径 *。然后,您的测试将能够找到应用生成的标头。