web-dev-qa-db-ja.com

Swift配列でdidSetとprivate(set)を使用する

私はSwiftプロジェクトに取り組んでおり、いくつかの配列があります。私の配列の1つで、特別なものの1つを使用せずにクライアントがそれを変更できないようにしたいです-定義されたメソッド一方、ゲッターにアクセスできるようにしたいのですが、追加とプロパティの設定に関して質問があります。

質問1private(set)はクライアントによるarray.appendの呼び出しを停止しますか?

別の配列で、変更されているかどうかを確認したいと思います。

質問2didSetを使用してプロパティオブザーバーを配列に追加すると、要素が配列に追加されたときにdidSetが呼び出されますか?

25
raoul

質問1: private(set)は、クライアントによるarray.appendの呼び出しを停止しますか?

はい、そうです。

質問2:didSetを使用してプロパティオブザーバーを配列に追加すると、要素が配列に追加されたときに呼び出されますか?

はい、append()が呼び出されるとdidSetが呼び出されます。

34
trevorj

Swiftの配列は効果的に値によって渡されることに気付くと、質問への回答は簡単に理解できます。効果的に言うのは、配列が次の場合にコピーされるかのように動作それらは渡されますが、物事を最適化し、実際に不必要に要素を複製することを回避するための巧妙な魔法が内部にあります。

didSetハンドラーは、プロパティ値が変更されたときに呼び出されます。これは、Swiftには配列が含まれます。したがって、append()はSwiftは、実際には整数の_+=_に類似しています。最初に配列が読み取られ、次に値が追加された新しい配列が作成され、その新しい配列がプロパティに書き戻されます。配列プロパティでappend()を呼び出すと、間違いなくdidSetが呼び出されます。同様に、setをプライベートにすると、外部ユーザーはappend()新しい値を配列に書き戻すことができないため。

4
devios1
  1. 質問1はい、関数呼び出しを変更すると保存された値が変更されるため、private(set)は変更関数の呼び出しを禁止します。
  2. 質問2はい、同じ理由で、オブザーバーがトリガーされます。

ここでは配列に固有のものは何もありません。これは、配列が構造体であり、appendが変更メンバーである結果です。 appendの呼び出しは、プロパティの新しい値に影響を与えるのと非常によく似ています。これはあまり明確ではありませんが、 変更メンバー および 保存されたプロパティ のドキュメントには、変更が言語によって適切に処理されるという事実を裏付ける詳細情報があります。

2
Alix Mougenot