swiftの公式ドキュメント

によると、「アクセス制御は、他のソースファイルやモジュール内のコードからコードの一部へのアクセ この機能を使用すると、コードの実装の詳細を非表示にしたり、そのコードにアクセスして使用できる優先インターフェイスを指定したりできます。”

Swift5は五つのアクセス制御を持っています。 それらは、オープン、パブリック、内部、fileprivate、およびプライベートです。 これらのアクセス制御は、モジュールとソースファイルの用途に基づいて定義されます。 このチュートリアルでは、swiftでアクセス制御を使用する方法、場所、方法を学びます。

open(制限の少ない)

openで定義されているものは、モジュール内またはモジュールなしでアクセスできます。 オープンアクセスレベルエンティティはどこからでもアクセスできます。 つまり、open変数はアクセスでき、open関数はオーバーライドでき、openクラスはそのモジュールをインポートすることによってモジュールの内部とモジュールの外でサブクラスにすることができます。

例は、UIKitフレームワークの”UITableViewCell”クラスです。 UIKitモジュールをインポートすることで、任意のクラスをUITableViewCellクラスとしてサブクラス化できます。 「UITableViewCell」の定義が表示されている場合は、UIKitモジュール内のクラス定義の前にオープンアクセス制御が表示されます。 そのため、UIKitをインポートすることで、任意のクラスをUITableViewCellクラスとしてサブクラス化できます。

@available(iOS 2.0, *)open class UITableViewCell : UIView, NSCoding, UIGestureRecognizerDelegate { }

public(オープンよりも制限的)

オープンアクセスと同様に、パブリックエンティティにもモジュールの内外にアクセスできます。 しかし、公開と公開の間には大きな違いがあります。

publicクラスはサブクラス化できず、publicメソッドは定義されたモジュールの外部でオーバーライドすることはできません。 定義されたモジュール内でサブクラス化またはオーバーライドする必要があります。

以下の例を確認してください

//module 1open class X{}
open func bar(){}public class Y{}
public func foo(){}//module 2class A: X{} // success
override func bar(){} // successclass B: Y{} //error
override func foo(){} // error

internal(モジュールレベルのアクセス制御)

“internal”定義されたモジュール内の任意の場所でエンティティを使用できます。 デフォルトのアクセスレベルは”internal”です。 通常、モジュールは、単一のユニットとして使用できるフレームワークまたはアプリです。

ターゲット(モジュール)内では、すべてのエンティティはデフォルトで内部です(明示的にアクセス制御を定義していない場合)。 これは、モジュール内のすべてのものが、そのモジュール内のどこからでも誰でもアクセスできるように定義されています。

fileprivate(ファイルレベルのアクセス制御)

fileprivateエンティティはswiftファイル内でのみアクセスできます。 Swiftファイルには、いくつかのクラスまたは構造を持つことができます。 Swiftファイル内のすべてのファイルプライベートエンティティには、そのファイル内のすべてのクラスまたは構造体からアクセスできます。 それらがなければ、そのファイルの外部の他のクラスはそれらにアクセスできません。 一般的に、モジュールの他のソースファイルから実装を隠します。

//** ViewController.swift **//class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad() let a = A()
a.x()
a.z() //error let b = B()
b.Y() // error
}
}class A {fileprivate func x(){
print("Inside ViewController file")
}
}
//** SecondViewController.swift **//class B{fileprivate func Y(){
print("Outside ViewController file")
}
}extension A{
fileprivate func Z(){
print("Outside ViewController file, extension of A")
}
}

private(クラスレベルのアクセス制御)

privateは、最も使用され、最も制限されたアクセス制御です。 プライベートエンティティは、宣言されたクラス(拡張を含む)内でのみアクセスできます。 通常、特定のクラスの外部で内部実装または機能を非表示にするために使用されます。

// ** ViewController.swift **//class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
x()
let a = A()
a.Y() // error
}
}extension ViewController{
private func x(){
print("Inside x")
}
}class A {
private func Y(){
print("Inside Y")
}
}

swiftアクセス制御の違い

ここで、異なるパラメータに基づいたアクセス修飾子の違いを表形式で確認します

おめでとうございます。swiftプログラミング言語でのアクセス制御についていくつかのアイデアが得られたと思います。 Swiftの公式ドキュメントでそれらの簡単な議論があります。

この記事が有用であることがわかった場合は、共有して拍手を送ってください。
mediumに関する他の記事をチェックし、linkedinで私を接続してください。

読んでくれてありがとう&幸せなコーディング

コメントを残す

メールアドレスが公開されることはありません。