私は最近の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)変数へのアクセスを手伝ってください。
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
は拡張機能でアクセス可能です
ファイル:TestFile.Swift
ここで、拡張機能とView Controllerは両方とも異なるファイルにあるため、プライベート変数testPrivateAccessLevel
は拡張機能ではアクセスできません。
ここでクラスViewController2
はViewController
のサブクラスであり、両方が同じファイルにあります。ここで、プライベート変数testPrivateAccessLevel
はサブクラスではアクセスできませんが、fileprivateはサブクラスでアクセスできます。
スタブが拡張機能内にすぐにある場合は記述できません。関数内に記述されることを意図しています。したがって、それはprivate/fileprivateの問題ではなく、拡張機能の理解です。拡張はクラス宣言の一部と考えてください。クラスでも、関数またはクロージャ内にスタブがある場合にのみ記述できます。
拡張機能内のfileprivate変数は、Swift 3でもアクセスできました。そのため、コメント_//accessible don't know the reason
_がわかりません。ただし、Swift 4では、privateの意味が変更されており、拡張機能がクラスと同じファイルで定義されている場合、プライベート変数も拡張機能内でアクセスできるようになります。これはSwift3には当てはまりませんでした。
_extension privateUsageExample: UITextFieldDelegate { func randFunc(){ self.fPriVar = true self.priVar = false } }
_