swift2 在Xcode中通过Objective-C代码测试Swift代码

btxsgosb  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(200)

我正在为我的项目编写测试用例(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

}
de90aj5v

de90aj5v1#

我发现了这个问题。测试目标中缺少桥接头(Swift Compiler - Code Generation -〉Objective-C桥接头)。我刚刚添加了桥接头并构建了项目。现在MyProjectTests-Swift. h显示了所有ObjectiveC生成的头声明。
希望这对遇到同样问题的人有帮助。

mznpcxlj

mznpcxlj2#

发现此问题是为了查找相关问题,为此我需要做一些其他事情来修复它:当您的应用使用Swift和Objective-C,并且您的测试目标也有混合语言时,您将需要在测试文件中编写以下代码,以便在ObjC测试中访问Swift类型:


# import "AppName-Swift.h"

如果这对您不起作用,那可能是因为测试目标无法找到应用目标的生成头

溶液

新增

$CONFIGURATION_TEMP_DIR/AppName.build/DerivedSources

测试目标的 * 构建设置〉标头搜索路径 *。然后,您的测试将能够找到应用生成的标头。

相关问题