为了测试快速对象,根据我所读的内容,我们将它们子类化并模拟想要返回测试值的方法。然后,我观看了有关快速性能的WWDC视频,演示者建议将类标记为final,以帮助编译器决定如何调用方法,并且从我看到的示例中可以看出,添加final可以有所帮助。

我遇到的问题是如何将类标记为final,但仍启用子类模拟?有人真的遇到过这个问题吗?还是应该从声明中删除final关键字?

任何建议都会很棒,或者如果没有任何建议告诉我我做的不好。

谢谢,
麦克风。

最佳答案

我知道这个主题有点老,但我还是想发表评论。您的另一个选择是面向协议(protocol)。在协议(protocol)中为最终类定义public接口(interface),并使final class实现该协议(protocol)。然后,您所要做的就是模拟协议(protocol),并且您的类(class)保持最终状态。这为您提供了静态调度和模拟。我不确定这是否是最好的选择,但这是我在框架构建中一直在使用的选择,以便我们可以测试框架代码,同时为使用中的应用程序提供优化的二进制文件。

internal protocol MockableProtocol {
    func deleteItem(_ itemId: String) -> Bool
    func fetchAllItems() -> [CustomObject]
    func fetchItem(for id: String) -> CustomObject?
}
internal final class MyFinalClass: MockableProtocol {
    func deleteItem(_ itemId: String) -> Bool {
        // Your code here
    }

    func fetchAllItems() -> [CustomObject] {
        // Your code here
    }

    func fetchItem(for id: String) -> CustomObject? {
        // Your code here
    }
}

然后在测试中:
class TestMockClass: MockableProtocol {
    func deleteItem(_ itemId: String) -> Bool {
        // Your code here
    }

    func fetchAllItems() -> [CustomObject] {
        // Your code here
    }

    func fetchItem(for id: String) -> CustomObject? {
        // Your code here
    }
}

关于使用final快速模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33487707/

10-11 11:19