gpt4 book ai didi

ios - 将扩展标记为 @objc 仅用于单元测试

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:58:06 24 4
gpt4 key购买 nike

我在 objective-c 中声明了一个类,如下所示:

@interface Person : NSObject

@property (nonatomic, readonly) NSString* firstName;
@property (nonatomic, readonly) NSString* lastName;

@end

我有一个在 Swift 中声明的扩展,用于获取 Person 的全名:

extension Person {
var fullName: String {
return "\(firstName) \(lastName)"
}
}

我想编写单元测试,在这里我想使用扩展名测试此人的全名。因此,我创建了一个模拟子类,并覆盖了 fullName 属性。但是,为了这样做,我必须使用 @objc 关键字将扩展公开到 objective-c 运行时。

有没有办法只为单元测试目标将扩展标记为@objc?标记扩展是否对编译/运行时有“重大”影响?

我尝试添加一个 Swift 编译时标志,例如:

#if UNIT_TEST_TARGET_RUNNING
@objc
#endif

但这会导致编译时错误。欢迎任何建议!请注意,示例已简化以呈现问题,并且无法更改 objective-c 接口(interface)。

最佳答案

标记扩展是否对编译/运行时有“重大”影响?

不是真的。编译器生成一个 thunk,它是一个调用 Swift 方法的 Objective C 方法。这个 thunk 是在 ObjC 运行时注册的,它就是它所看到的。除其他事项外,它与 Swift 通用货币类型以及对象 C 中使用的货币类型相互转换。

如果您想子类化并覆盖该属性,请继续这样做。这真的没什么大不了的。

或者,您可以将类的接口(interface)提取到一个协议(protocol)中,在您的“真实”实现中遵循该协议(protocol),并创建一个模拟所有测试方法的测试替身。

关于ios - 将扩展标记为 @objc 仅用于单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57715733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com