1. ホーム
  2. objective-c

[解決済み] Swift の外部読み取り専用、内部読み書き可能なプロパティ

2022-10-29 12:52:02

質問

Swift では、プロパティが外部からは読み取り専用であるが、それを所有するクラス (およびサブクラス) によって内部的に変更可能であるという一般的なパターンを定義する従来の方法は何ですか。

Objective-Cでは、以下の選択肢があります。

  • インターフェイスでプロパティを readonly として宣言し、クラス拡張を使用して内部でプロパティにアクセスする。これはメッセージベースのアクセスであるため、KVO、アトミック性などとうまく連動します。
  • インターフェイスでプロパティを readonly として宣言し、内部でバッキング ivar にアクセスします。ivar のデフォルトのアクセスは protected であるため、これはクラス階層でうまく機能し、サブクラスも値を変更できるようになりますが、フィールドはそれ以外では readonly です。

Javaでは、規約は

  • protectedフィールドを宣言し、publicで読み取り専用のゲッター(メソッド)を実装します。

Swiftのイディオムってなんですか?

どのように解決するのですか?

クラスのプロパティがある場合、プロパティ宣言の前にアクセス修飾子を付け、その後に get または set のように括弧で囲みます。例えば、パブリックゲッターとプライベートセッターを持つクラスのプロパティは、次のように宣言されます。

private(set) public var readonlyProperty: Int

お勧めの読み物 ゲッターとセッター

マーティンのアクセシビリティレベルに関する考察はまだ有効です。 protected 修飾子がないことです。 internal はモジュールへのアクセスのみを制限します。 private は現在のファイルのみに、そして public は制限なし。

Swift 3 のメモ

2つの新しいアクセス修飾子。 fileprivateopen が言語に追加され、一方 privatepublic は少し修正されています。

  • open はクラスとクラスメンバにのみ適用されます。これは、クラスがサブクラス化されたり、メンバが定義されたモジュールの外部でオーバーライドされたりすることを許可するために使用されます。 public を使用すると、クラスやメンバは一般にアクセスできるようになりますが、継承やオーバーライドはできません。

  • private はメンバーを可視化し、囲んでいる宣言からのみアクセスできるようにします。 fileprivate はそのメンバが含まれるファイル全体に対して

その他の詳細 こちら .