微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

快速嘲笑使用final

为了测试 swift对象,从我读过的内容中,我们对它们进行子类化并模拟我们想要的方法返回我们的测试值.然后,我观看了一个关于快速性能的WWDC视频,并且演示者建议将类标记为最终,以帮助编译器决定如何调用方法,从我看到添加final的示例可以提供帮助.

我遇到的问题如何将类标记为final,但仍然允许子类模拟?有没有人真正遇到这个问题或者我应该从我的声明中删除最后一个关键字?

任何建议都很棒,或者没有任何建议可以告诉我,我做得不对.

谢谢,
麦克风.

解决方法

我知道这个帖子有点旧,但我想我还是会发表评论.你的另一个选择是面向协议.在协议中定义最终类的公共接口,并使最终类实现该协议.然后,您所要做的就是模拟协议,您的课程将保持最终状态.这为您提供静态调度和模拟.我不确定这是否是本身最好的选项,但它是我在框架构建中使用的那个,这样我们就可以测试我们的框架代码,同时为消费应用程序提供优化的二进制文件.

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
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐