Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中,如何使私有变量对单独文件中扩展名中的代码可见?_Swift_Extension Methods - Fatal编程技术网

在Swift中,如何使私有变量对单独文件中扩展名中的代码可见?

在Swift中,如何使私有变量对单独文件中扩展名中的代码可见?,swift,extension-methods,Swift,Extension Methods,我使用了一些我没有编写的遗留代码,将一个大型视图控制器几乎平均地分成两部分。主回调包含除ui回调之外的所有内容,并且所有回调都被移动到扩展中。我在一个文件中完成了所有这些,这使它很容易做到 然而,当我创建第二个文件并将扩展代码移到其中时,有一个混乱的细节。一旦一半的代码被移动到一个单独的文件中,事情就破裂了。扩展名中的方法无法使用主文件中定义的私有属性。如何使属性仅对同一类的其他元素可用,即使该类的某些部分位于另一个文件中?我的解决办法是没有任何私有变量,这并不理想。检查这两个已经在Swift

我使用了一些我没有编写的遗留代码,将一个大型视图控制器几乎平均地分成两部分。主回调包含除ui回调之外的所有内容,并且所有回调都被移动到扩展中。我在一个文件中完成了所有这些,这使它很容易做到


然而,当我创建第二个文件并将扩展代码移到其中时,有一个混乱的细节。一旦一半的代码被移动到一个单独的文件中,事情就破裂了。扩展名中的方法无法使用主文件中定义的私有属性。如何使属性仅对同一类的其他元素可用,即使该类的某些部分位于另一个文件中?我的解决办法是没有任何私有变量,这并不理想。

检查这两个已经在Swift 4中实施的Swift演进方案

由于接受并实施了SE-0025,扩展无法访问扩展类型的
private
成员

SE-0169稍微放宽了此规则,但扩展名仍需要位于原始类型定义的同一源文件中,才能访问
private
成员

我的解决方法是不使用任何私有变量


对于您的问题,这是一个实用的解决方案,否则您可能需要将所有访问
private
成员的扩展名移到同一个源文件中。

我建议将两个单独文件中的代码重新添加到同一个文件中。将类型的主声明以及该类型的任何扩展名放在同一个文件中没有错。这允许您使用
fileprivate
处理任何您想要私有的内容,例如变量,但同一文件中的任何内容都可以访问它们

更新


正如OOPer在回答中提到的,
fileprivate
可以替换为
private

换句话说,不使用
private
,而是使用默认(
internal
)访问级别可以解决这些问题。正如旁注一样,UI回调、属性(outlets)这样的东西是由视图控制器管理的。您可以创建另一个实际处理数据的文件,并从视图控制器调用它。这实际上被一些代码体系结构所使用,比如,您有一个交互者(业务逻辑)和一个演示者(格式化数据并选择何时呈现数据)。视图控制器是被动的。因此,它在interactor上调用
didSelect…
,然后在presenter上调用
updateData…
。感谢您的输入,我非常感谢(投票)。现在我有两个400多行的文件,我不想回到800行的文件。我正在使用private,但现在将放弃它。一旦我的整个项目(150多个类)稳定下来,我将重新审视如何将这两个文件重构为多个类。