在 Swift 中,如何使私有变量对位于单独文件中的扩展中的代码可见?
In Swift, how do I make private variables visible to code in an extension which is in a separate file?
我使用了一些我没有编写的遗留代码,将一个大视图控制器几乎均匀地分成两部分。主要的包含除来自 ui 的回调之外的所有内容,并且所有回调都已移至扩展中。我在一个文件中完成了所有这些工作,这很容易做到。
但是,当我创建第二个文件并将扩展代码移至其中时,出现了一个混乱的细节。一旦一半的代码被移到一个单独的文件中,事情就崩溃了。扩展中的方法不能使用主文件中定义的私有属性。如何使 属性 仅对相同 class 的其他元素可用,即使 class 的部分内容在另一个文件中?我的解决方法是不使用任何私有变量,这并不理想。
检查这两个 Swift 已经在 Swift 4
中实施的进化建议
SE-0169 Improve Interaction Between private
Declarations and Extensions
自从 SE-0025 被接受并实施后,扩展无法访问 private
个扩展类型的成员。
SE-0169 稍微放宽了这个规则,但是扩展仍然需要在原始类型定义的同一个源文件中,才能访问 private
个成员。
我的解决方法是没有任何私有变量
这是针对您的问题的一种实用解决方案,否则您可能需要将访问 private
成员的所有扩展移动到同一个源文件中。
我建议将两个单独文件中的代码添加回同一个文件中。将一个类型的主要声明和该类型的任何扩展放在同一个文件中并没有错。这允许您将 fileprivate
用于您想要私有的任何内容,例如变量,但同一文件中的任何内容都可以访问它们。
更新
正如 OOPer 在 answer, fileprivate
can be replaced with private
as of SE-0169 中提到的那样。
我使用了一些我没有编写的遗留代码,将一个大视图控制器几乎均匀地分成两部分。主要的包含除来自 ui 的回调之外的所有内容,并且所有回调都已移至扩展中。我在一个文件中完成了所有这些工作,这很容易做到。
但是,当我创建第二个文件并将扩展代码移至其中时,出现了一个混乱的细节。一旦一半的代码被移到一个单独的文件中,事情就崩溃了。扩展中的方法不能使用主文件中定义的私有属性。如何使 属性 仅对相同 class 的其他元素可用,即使 class 的部分内容在另一个文件中?我的解决方法是不使用任何私有变量,这并不理想。
检查这两个 Swift 已经在 Swift 4
中实施的进化建议SE-0169 Improve Interaction Between private
Declarations and Extensions
自从 SE-0025 被接受并实施后,扩展无法访问 private
个扩展类型的成员。
SE-0169 稍微放宽了这个规则,但是扩展仍然需要在原始类型定义的同一个源文件中,才能访问 private
个成员。
我的解决方法是没有任何私有变量
这是针对您的问题的一种实用解决方案,否则您可能需要将访问 private
成员的所有扩展移动到同一个源文件中。
我建议将两个单独文件中的代码添加回同一个文件中。将一个类型的主要声明和该类型的任何扩展放在同一个文件中并没有错。这允许您将 fileprivate
用于您想要私有的任何内容,例如变量,但同一文件中的任何内容都可以访问它们。
更新
正如 OOPer 在 fileprivate
can be replaced with private
as of SE-0169 中提到的那样。