問題タブ [property-wrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
245 参照

swift - 自動合成されたinitメソッドでデフォルト以外のパラメータを持つパラメータ化された@PropertyWrapper?

v1. パラメーターなし: ✅ 期待どおりに動作します

通常、次のようにTrimmed ラッパーを作成できます。

titleデフォルト値のないパラメータ (例: ) とデフォルト値のあるパラメータ (例: ) の両方で問題なく動作していることに注目してくださいbody


v2. 1 つのパラメーター: ❌ コンパイルしない

ここで、 をハードコーディングしたくないと想像してください。.whitespacesAndNewlines代わりに、実装者がこの値を提供できるようにします。

私が抱えている最初の問題はtitle、デフォルト値のないパラメーターである がコンパイルされないことです。値を追加する必要がありwrappedValueます。


v3. デフォルトのプロパティ値を指定します: ⚠️ コンシューマはパラメータを省略できます

このコンパイラ エラーを修正する最も簡単な方法は、次のようにデフォルト値を指定することですbody

titleただし、自動合成されたコンストラクターを介して消費者に値を提供するように強制する機能が失われました。


v4. デフォルトwrappedValueの提供: ⚠️ コンシューマーに公開される PropertyWrapper

デフォルト値を指定する代わりに、元のエラー メッセージに従いwrappedValuetitle, が再度必要になった場合は、さらに大きな問題があります。

より大きな問題は、現在 Trimmed が消費者に公開されているため、単純に String 値を提供できず、さらに悪いことに、構造体の動作を変更できます (たとえば、別の を提供することによってcharacterSet)。


v5. カスタム init の提供: ⚠️ 自動合成された init を取得しなくなりました

これらすべての問題を解決する 1 つの方法は、自動合成された init に依存せず、代わりに独自の init を提供することです。v2 の構文エラーを解決するには、 のデフォルト値も指定する必要がありますtitlebodyこれは、 (例: )の場合と同じ方法で行うvar title: String = ""か、または Trimmed.wrappedValue にデフォルト値を追加することで行うことができます。どちらも機能的に同等です。

ただし、パラメーター化された PropertyWrapper + デフォルト引数なし + 自動合成コンストラクターがうまく連携する方法があるかどうか疑問に思っています。


パラメータ化された PropertyWrapper がある場合、コンシューマに自動合成されたコンストラクタで値を提供させるにはどうすればよいですか?

(たとえば、不要な副作用なしに v2 をコンパイルするにはどうすればよいですか?)


注: 元の質問は、パラメーター化された値の既定のプロパティ値を期待どおりに動作させることに関するものでしたが、いくつかの調査を行った後、根本的な問題は上記の問題のようです。したがって、質問は単純化されました。

0 投票する
1 に答える
257 参照

swift - Swift @ObservedObject は別のプロパティで初期化します

EDITは、変数の宣言を示すソースコードを追加しました

@ObservedObject であるビュー モデル プロパティを初期化しようとしています。 @ObservedObject private var viewmodel : ExpenseListViewModel

コンストラクターのパラメーターとして ManagedObjectContext を受け入れるリポジトリでビュー モデルを初期化したい

ビューモデルにはプロパティラッパーがあるため、計算されたプロパティとして作成することもできません。

初期化でリポジトリとビューモデルを初期化しようとすると、初期化される前に自己が使用されます

0 投票する
1 に答える
290 参照

swift - @AppStorage プロパティ ラッパーを VoiceOver で切り替えることができない

iOS 14 @AppStorage で新しい @property ラッパーを使用しようとしています。ただし、トグルで使用すると、VoiceOver で切り替えることができないようです。通常の @State プライベート var プロパティは正常に機能します。これらが VoiceOver がオンになっていない状態で動作することを確認できます。

  1. これは自分で解決できるアクセシビリティの問題ですか?
  2. これは Apple が修正する必要がある iOS14 のバグですか?

以下のコード:

0 投票する
2 に答える
197 参照

ios - カスタム プロパティ ラッパーが、SwiftUI の TextField の状態を正確に反映していません。

いくつかのロジックを挿入したいプロパティ ラッパーを作成しました。「設定」値は正しく動作していますが、テキスト フィールドはすべて大文字のテキストで更新されません。テキスト フィールドにすべて大文字のテキストを表示するべきではありませんか、それともこれがどのように機能するかを誤解していますか?

また、これは不自然な例です。私の最終目標は、プロパティ ラッパーにさらに多くのロジックを挿入することです。大文字の例を使用して機能させるだけです。インターネット全体を検索しましたが、有効な解決策が見つかりませんでした。