Swift 中的友元类(访问内部类的私有成员)

Posted

技术标签:

【中文标题】Swift 中的友元类(访问内部类的私有成员)【英文标题】:Friend classes in Swift (access private members of internal class) 【发布时间】:2016-07-10 00:30:00 【问题描述】:

我在两个不同的文件中有两个 Swift 类,它们都在同一个目标中。有没有办法让一个人访问另一个人的private 成员而不将它们暴露为internalpublic

(我实际上是在寻找类似于 C++ 中的 friend 的东西。)


动机:

这对于在单独的“转换”类中实现 UIViewControllerAnimatedTransitioning 可能很有用——通常需要对源视图控制器和目标视图控制器有深入的了解——而不需要这些视图控制器将 private 子视图暴露给其余的目标。

【问题讨论】:

C++ 好友功能太疯狂了。这就是为什么没有其他语言实现它的原因。如果您想访问变量,请将它们公开。 我个人觉得它在编写单元测试时很有用。 当前 Swift 中的单元测试状态是疯狂的。为什么@testable 只显示内部方法? 我也有一个很好的用例。但每天我都看到斯威夫特是个赤裸的皇帝。它只是在这个位置,因为它得到了所有 Apple 粉丝男孩的欢呼。 【参考方案1】:

我在两个不同的文件中有两个 Swift 类,它们都在同一个目标中。有没有办法让一个人访问另一个人的私有成员而不将它们暴露为内部或公共?

没有。你得到的规则就是你得到的规则。没有什么神奇的方法可以打破它们。您可以将这两种类型放在同一个文件中,或者(在另一个极端)您可以将它们都移到它们自己的模块中并给它们internal 范围,这样它们就可以看到彼此但没有其他人可以看到他们。

这对于在单独的“过渡”类中实现 UIViewControllerAnimatedTransitioning 可能很有用——通常需要对源视图控制器和目标视图控制器有深入的了解——而不需要这些视图控制器将私有子视图暴露给目标的其余部分

我不明白你为什么需要这个。将 UIViewControllerAnimatedTransitioning 材质移动到它自己的文件中很容易。不需要公开私有子视图。这就是为什么这些东西被分解成一个单独的协议。动画师和视图控制器的角色已经完全独立。如果您认为需要公开私有子视图,那么您做错了(您应该问一个关于 that 的问题)。 [例如,您可能不知道transitionCoordinator 函数,它允许视图控制器在不知道它是什么的情况下参与其过渡动画。]

【讨论】:

例如:github.com/mattneub/custom-alert-view-ios7/blob/master/… 在这里我封装了关于如何执行转换和呈现的所有内容,而不知道正在呈现什么视图控制器。跨度>

以上是关于Swift 中的友元类(访问内部类的私有成员)的主要内容,如果未能解决你的问题,请参考以下文章

C++之:友元类

什么是友元?

C++ 友元

C++中,啥叫友元函数?啥叫友元类?请举例说明。

友元函数和友元类

类与类之间的友元关系可以继承吗? 友元函数是类的成员函数吗?