SwiftUI 问答之尽管闭包(和函数)是Swift中的引用类型,但无法使用==或比较它们===。但为什么

尽管闭包(和函数)是Swift中的引用类型,但无法使用==或比较它们===。但为什么

尽管闭包(和函数)是Swift中的引用类型,但无法使用==或比较它们===。但为什么?

在其他语言中,例如Objective-C,比较函数指针很简单。在Swift中,您会得到一个错误。尝试使用具有相同签名的两个闭包(或函数)进行比较==将产生编译器错误“无法应用二进制运算符’==’”。如果尝试使用===,编译器将产生错误“无法检查函数的引用相等性”。

在寻找原因之后,我最终在Apple Developer论坛上找到了该主题。具有讽刺意味的是,它链接到该StackOverflow线程,该线程也链接到这个旧的Apple开发人员论坛线程,该线程现在当然是断开的链接,因为去年新的论坛推出时,Apple的所有人都不会理会正确地进行Web开发。

反正。显然,在旧论坛的某个地方,存在来自Chris Lattner的以下答案。(非常感谢,StackOverflow上的人员直接引用了论坛主题,而不仅仅是发布了链接。)

这是我们有意不想支持的功能。有多种情况会导致指针的功能相等(在快速类型的系统意义上,其中包括几种闭包)根据优化而失败或更改。如果在函数上定义了“ ===”,则不允许编译器合并相同的方法主体,共享thunk并在闭包中执行某些捕获优化。此外,在某些泛型上下文中,这种相等性将非常令人惊讶,在这种情况下,您会得到重新提取的重击,将函数的实际签名调整为该函数类型所期望的签名。

您不仅不能比较函数指针,而且如果可以的话,还要求有很多麻烦。

现在,您可以深入研究Swift的“不安全” API,创建UnsafePointer,比较它们,等等。但这是一个非常糟糕的主意。即使您最终编写的代码通过了单元测试,也可能无法通过优化来解决。 -或更糟糕的是,它有时只会起作用。否则,它将在未来中断。

就像我说的那样,事实证明我根本不需要实际比较函数指针。有一个更好的解决方案。您可能认为您需要这个。您(几乎可以肯定)不会。


加入我们一起学习SwiftUI

QQ:3365059189
SwiftUI技术交流QQ群:518696470
教程网站:www.openswiftui.com

发表回复