了解Swift的静态属性

静态属性是类级别的属性。 一个类的所有实例共享该类的相同静态属性。 最近,我的团队在UIAlertController上实现了扩展,以将重复的警报控制器代码块变成一个衬里。 他们遇到了一个问题,即用于打开“设置”的自定义UIAlertAction只能工作一次,但此后再也不能工作。 我对其进行了进一步研究,并意识到问题在于UIAlertAction的定义。 它定义为静态常数。

最初的猜测是问题出在处理程序之内。 因为处理程序正在正确执行(每次都不会执行),所以我认为这是错误的。 我记得斯坦福大学CS193p的一个项目“集中”。 在Concentration中,“ Game”类具有静态变量,所有实例均引用该属性。 在扩展中,每个单独的自定义UIAlertAction被定义为静态的。 我意识到这一定是个问题。 创建一个类级别的UIAlertAction并在其第一个警报调用时执行其处理程序,但随后的所有警报均引用该已执行的处理程序。

我的解决方案是将UIAlertAction定义为计算的非静态变量。 (扩展位于UIAlertController上,扩展内是自定义的静态UIAlertActions)。 这意味着,每次使用“ openSettings”动作对“ presentAlert”(扩展中的主要功能)的调用都将返回该动作的唯一实例。

为了适应团队的偏爱,使用了每次返回一个新实例变量的静态变量。 他们指出,返回实例变量(多个内存分配)的静态变量(单个内存分配)可能会引起误解,因此对此的更好替代方法是返回实例变量的静态函数。

计算机科学拥有许多健康的概念,在研究它们时似乎只不过是抽象,因此在实际的,可观的应用程序中发现一个价值始终是一件好事。 尽管作为开发人员,我们有时有时可以使XYZ正常运行,但花一些时间通过诸如Concentration之类的项目来尝试基本概念仍然可以证明是非常有用和省时的。