1

作为这里的示例代码, Swift 中同一个文件中的private和类有什么区别?fileprivate

//  ViewController.swift

private class A {
    var name: String = ""

    let d = B.D()
}

fileprivate class B {
    var name: String = ""

    private let c = C()
    private class C {
        var number: String = ""
    }

    fileprivate let d = D()
    fileprivate class D {
        var number: String = ""
    }
}

由于 A 类和 B 类在示例文件中,A 不能比 B 更私有,对吧?

抱歉,这是一个非常挑剔的问题,但我只是想确认一下。

4

2 回答 2

3

在过去的几个版本中,swift 中的访问修饰符已经收费了几次。现在,让我先建议一个代码示例而不是解释:

一个文件中的所有代码:

fileprivate class Foo {

  private var someVariablePrivate: Int?
  fileprivate var someVariableFileprivate: Int?

  private func makeBar() { }
  fileprivate func makeFoo() { }
}

extension Foo {

  func bar() {
    let value = someVariablePrivate // OK
    let value2 = someVariableFileprivate // OK
  }
}

private class Foofoo: Foo {

  override func makeFoo() {
    // OK
  }

  override func makeBar() {
    // NOK, because private
  }
}

class Bar {

  func foo() {
    let object = Foo()
    let value = object.someVariableFileprivate // OK
    let value2 = object.someVariablePrivate // NOK - because it private to that class
  }
}

以前 private 限制只能访问类型定义,但是在 Swift 的几个最新版本中,它已经被修改和更新,所以即使是相同类型的扩展也可以使用私有变量

正如苹果提到的

文件私有访问将实体的使用限制在其自己的定义源文件中。当在整个文件中使用这些细节时,使用文件私有访问来隐藏特定功能的实现细节。

私有访问将实体的使用限制为封闭声明,以及该声明在同一文件中的扩展。当这些细节仅在单个声明中使用时,使用私有访问来隐藏特定功能的实现细节。

我们可以比较一下这个修饰符:

在此处输入图像描述

为什么我们要同时使用它们:

但是,您可能希望将代码的某些部分标记为文件私有或私有,以便在应用程序模块中的其他代码中隐藏它们的实现细节。

于 2020-07-10T05:28:10.427 回答
0

何时使用 fileprivate

尽管关键字几乎相同,但它们的用例存在明显差异。Fileprivate 访问限制在同一定义的源文件中使用实体。使用 fileprivate 的唯一原因是当您想从不同的类或结构访问同一文件中的代码时。

何时使用私有

private 关键字被更多地使用,并将实体的使用限制在封闭的声明及其扩展中。但是,扩展名必须在同一个文件中定义。换句话说,私有声明在文件之外是不可见的。您可以使用此关键字仅公开与实体交互所需的最少代码。这将提高可读性,并使其他人更容易使用和理解您的代码。

您的问题: 由于 A 类和 B 类在示例文件中,A 不能比 B 更私有,对吧?

如果class A使用私有访问说明符,它将无法在其声明的范围之外访问。

如果class B它可以访问, class A但它的私有属性将无法访问class A

有关更多信息,您可以参考这篇有趣的文章:

https://www.avanderlee.com/swift/fileprivate-private-differences-explained/#when-to-use-private

于 2020-07-10T04:38:22.840 回答