web-dev-qa-db-ja.com

Swift 4を使用して、拡張子および別のクラスのfileprivateおよびprivate変数にアクセスする

私は最近のSwift docsを見て、Swift4のprivateキーワードとfileprivateキーワードを理解するいくつかの例に取り組んでいます。同じクラスの拡張でfileprivateとprivate変数にアクセスしようとしています。クラスをサブクラス化する別のクラスですが、出力は実りません。私は次のように使用しています

  class privateUsageExample: UIViewController {
    private var priVar = false
    fileprivate var fPriVar = false
  }

  // usage of extension in the same class

  extension privateUsageExample: UITextFieldDelegate {

     if priVar{ // do something} // error : expected declaration
     if fPriVar{ // do something} // error : expected declaration

     func randFunc(){ 
        self. fPriVar = true // accessible don't know the reason 
      }
  }

  // access of private and fileprivate variables in another class different file

  class anotherUsageInDiffSwiftFile: privateUsageExample {

   priVar = false // inaccessible (how to access it)
   fPriVar = true // inaccessible (how to access it)

 }

同じファイル内の同じクラスの拡張子、および異なるファイル内のクラスをサブクラス化する別のクラスのpriVar(プライベート)およびfPriVar(fileprivate)変数へのアクセスを手伝ってください。

9
arun_K

In Swift 4.0、Privateは拡張子で同じファイル内でアクセスできるようになりました。他のファイルで拡張子を宣言/定義すると、プライベート変数は拡張子でアクセスできなくなります**

ファイルプライベート
ファイルプライベートアクセスは、エンティティの使用を独自の定義ソースファイルに制限します。ファイルプライベートアクセスを使用して、特定の機能の詳細がファイル全体で使用されている場合、それらの詳細を非表示にします。
構文:fileprivate <var type> <variable name>
例:fileprivate class SomeFilePrivateClass {}


プライベート
プライベートアクセスは、エンティティの使用を囲んでいる宣言と、同じファイル内にあるその宣言の拡張に制限します。プライベートアクセスを使用して、特定の機能の実装詳細を非表示これらの詳細は、単一の宣言内でのみ使用されます。
構文:private <var type> <variable name>
例:private class SomePrivateClass {}


すべてのアクセスレベルの詳細を次に示します。 Swift-Access Levels

この画像を見てください:
ファイル:ViewController.Swift
ここで、拡張機能とView Controllerは両方とも同じファイルにあるため、プライベート変数testPrivateAccessLevelは拡張機能でアクセス可能です

enter image description here


ファイル:TestFile.Swift
ここで、拡張機能とView Controllerは両方とも異なるファイルにあるため、プライベート変数testPrivateAccessLevelは拡張機能ではアクセスできません。

enter image description here

enter image description here


ここでクラスViewController2ViewControllerのサブクラスであり、両方が同じファイルにあります。ここで、プライベート変数testPrivateAccessLevelはサブクラスではアクセスできませんが、fileprivateはサブクラスでアクセスできます。

enter image description here

17
Krunal
  1. スタブが拡張機能内にすぐにある場合は記述できません。関数内に記述されることを意図しています。したがって、それはprivate/fileprivateの問題ではなく、拡張機能の理解です。拡張はクラス宣言の一部と考えてください。クラスでも、関数またはクロージャ内にスタブがある場合にのみ記述できます。

  2. 拡張機能内のfileprivate変数は、Swift 3でもアクセスできました。そのため、コメント_//accessible don't know the reason_がわかりません。ただし、Swift 4では、privateの意味が変更されており、拡張機能がクラスと同じファイルで定義されている場合、プライベート変数も拡張機能内でアクセスできるようになります。これはSwift3には当てはまりませんでした。

_extension privateUsageExample: UITextFieldDelegate {
    func randFunc(){
        self.fPriVar = true 
        self.priVar = false
    }
}
_
  1. 変数がprivate/fileprivateとして定義されている場合、別のファイルの拡張子でそれらにアクセスできないのではないかと心配しています。
3
Puneet Sharma