私はSwiftプロジェクトに取り組んでおり、いくつかの配列があります。私の配列の1つで、特別なものの1つを使用せずにクライアントがそれを変更できないようにしたいです-定義されたメソッド一方、ゲッターにアクセスできるようにしたいのですが、追加とプロパティの設定に関して質問があります。
質問1:private(set)
はクライアントによるarray.append
の呼び出しを停止しますか?
別の配列で、変更されているかどうかを確認したいと思います。
質問2:didSet
を使用してプロパティオブザーバーを配列に追加すると、要素が配列に追加されたときにdidSet
が呼び出されますか?
質問1: private(set)は、クライアントによるarray.appendの呼び出しを停止しますか?
はい、そうです。
質問2:didSet
を使用してプロパティオブザーバーを配列に追加すると、要素が配列に追加されたときに呼び出されますか?
はい、append()
が呼び出されるとdidSet
が呼び出されます。
Swiftの配列は効果的に値によって渡されることに気付くと、質問への回答は簡単に理解できます。効果的に言うのは、配列が次の場合にコピーされるかのように動作それらは渡されますが、物事を最適化し、実際に不必要に要素を複製することを回避するための巧妙な魔法が内部にあります。
didSet
ハンドラーは、プロパティ値が変更されたときに呼び出されます。これは、Swiftには配列が含まれます。したがって、append()
はSwiftは、実際には整数の_+=
_に類似しています。最初に配列が読み取られ、次に値が追加された新しい配列が作成され、その新しい配列がプロパティに書き戻されます。配列プロパティでappend()
を呼び出すと、間違いなくdidSet
が呼び出されます。同様に、set
をプライベートにすると、外部ユーザーはappend()
新しい値を配列に書き戻すことができないため。
ここでは配列に固有のものは何もありません。これは、配列が構造体であり、append
が変更メンバーである結果です。 append
の呼び出しは、プロパティの新しい値に影響を与えるのと非常によく似ています。これはあまり明確ではありませんが、 変更メンバー および 保存されたプロパティ のドキュメントには、変更が言語によって適切に処理されるという事実を裏付ける詳細情報があります。