web-dev-qa-db-ja.com

swiftの静的関数とシングルトンクラスの違い

すべてのユーティリティメソッドが保持され、これらのメソッドがアプリ全体で使用されるクラスを作成したいと思います。
問題:1
シングルトンクラスを作成し、そこに必要なすべてのメソッドを保持するのは良いですか、またはすべての関数が静的になるクラスを作成する必要がありますか。
問題:2
Swiftの上記2つのアプローチの主な違いは何ですか?
問題:
iOSのパフォーマンスにどのように影響しますか?

31
Sunil Sharma

確かにこれは紛らわしく聞こえ、議論の余地があります。しかし、ベストプラクティスから、いくつかの提案をすることができます。

Singletonは通常、リソースを集中的に使用し、タイマーの初期化を1つ作成するために使用されます。たとえば、データベースコネクタ、ログインハンドラなどです。

ユーティリティクラスは、静的な関数と変数のみを持つクラスです。非同期タスクや、データベースコネクタを開くなどの高コストのリソース処理を処理するべきではありません。

あなたの場合、ユーティリティがリソース集約的なプロセスを実行している場合は、シングルトンでラップする方が良いでしょう。そうでない場合は、クラスの静的関数が私の意見ではより優れています。 Swiftはstatic dispatchを使用してクラス内のすべての静的関数をディスパッチします。シングルトンではSwift最適化が好きです。

静的ディスパッチは動的ディスパッチより4倍高速です Objective-Cランタイムが使用される限り。これはSwiftにも当てはまります。ただし、Dynamiclyをディスパッチするには4ナノ秒しかかかりません。

これで明らかになるといいのですが。

25
kandelvijaya

2つのクラスがあるとします。

すべての静的メソッドと静的変数を持つクラスこの方法で、オブジェクトをインスタンス化せずにクラスメソッドにアクセスできます。また、いくつかの小さなデータハンドルが必要な場合は、静的変数に格納できます。このクラスにアクセスするすべてのスレッドが、データ変数の重複インスタンスを作成することにはなりません。

Singleton Classこのクラスにはプライベートinitメソッドがあり、静的インスタンスを通じて単一のインスタンスを共有します。インスタンスにアクセスするすべてのスレッドが、データ変数の重複インスタンスを作成することにはなりません。

したがって、技術的には、Utilityクラスのシナリオではどちらも非常に似ているように聞こえる可能性があり、決定を行うのが混乱する可能性があります。次の使用例を使用して決定を行うことができます。

  • このクラスは主に論理的な実装を定義していますか?クラスメソッドの主な目的が、一時的なハンドル以外の変数にデータを格納する必要のない論理的な計算/操作または操作を提供することである場合は、常に静的クラスを選択する必要があります。例えばここで言及したユーティリティクラス。画像のサイズ変更、ファイルの読み取り、データ構造の解析などのユーティリティメソッドは、静的メソッドを使用するのが最適です。

  • クラスが複数の変数に重要な情報を格納する必要がある場合は、リソースアクセスを制限し(たとえば、データベースでの同時トランザクションの数を制限したり、同時ネットワーク呼び出しの数を制限したり)、リソースを頻繁に割り当てたり割り当て解除したり(実行時にメモリを管理)したりするのが最善です。シングルトンクラスを使用します(たとえば、db構造へのアクセス、ネットワークリソースの管理などのためのクラス)。

28
chejaras

staticsingletonの主な違いは、SingletonProtocolsを実装して、いくつかの基本クラスから派生できることです。 Singletonの場合、クラスはインスタンス化できますが、インスタンスは1回だけです。 Static関数は、インスタンス化せずに直接使用できます。

したがって、ユーティリティメソッドのクラスを作成する場合は、シングルトンではなく、静的ユーティリティ関数を持つクラスである必要があります。静的クラスとシングルトンクラスの両方をスレッドセーフで実装できます。

7