問題タブ [swift-structs]

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 投票する
1 に答える
302 参照

swift - 構造体/プロトコルを使用した迅速なポリモーフィック クロージャ ディスパッチ

サービスに引数クロージャを 1 つ登録するか、引数クロージャを登録しない場合があります。利用可能な引数は常にありますが、簡潔にするために、arg クロージャーも登録せず、その場合は利用可能な引数なしでクロージャーをディスパッチできるようにしたいと考えています。強力な OO と動的型のバックグラウンドから来て、ポリモーフィック ディスパッチとクラス継承ツリーが大好きで、型自体が理解できるようにすることで、次のことをまとめることができます。

そのため、コンソールに42続いて表示されます。something happened偉大な。

structしかし、 and/orを使用してこれを行うことを検討したいと思いenumます。値のセマンティクスは大流行しています。アプローチは比較的簡単だったenumと思います:

アプローチを行うにstructは、プロトコルを使用して の共通インターフェイスをキャプチャする必要があることを理解していますpublish(value:T)。しかし、プロトコルは明らかにジェネリックと混在できないため、混乱が生じるのはここからですか? 私は試した:

これにより、下部に多くのエラーが発生します。extension NullaryAction<T>:Action拡張機能をジェネリック (例: )として実行しようとしましたが、拡張機能に式をT配置したにもかかわらず、使用されていないことがわかりtypealiasました。

構造体/プロトコルでこれを行うことは可能ですか? 列挙型ソリューションには満足していますが、構造体/プロトコルのアプローチでは実現できなかったことに失望しました。

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

swift - あるクラスから別のクラスへの構造体へのアクセス

別のクラスから構造体にアクセスすることは可能ですか?

元:

クラス B() のクラス A() から構造体にアクセスするにはどうすればよいですか?

これに回避策はありますか?

ありがとうございました!

0 投票する
4 に答える
1842 参照

swift - Swift で `struct` に対して自動的に比較 (`==`) 関数を定義する方法はありますか?

structSwiftにかなり大きなものがあると仮定しましょう:

..そして、Equatableプロトコルを実装する必要があります:

...そして、ばかげたコードを何行も書く必要があります。私たちのためにそれを「行う」ようにコンパイラに「依頼する」方法はありますか?

0 投票する
0 に答える
688 参照

ios - 変更可能な構造体としてのSwift 2.2 MVVMビューモデルは、View Controllerで状態を維持しません

Swift での値型と参照型の違いについてはかなり認識しており、値型は不変の使用法として設計されていることを認識しています。しかし、特に構造体は自分自身を変異させる能力があり、それが私の懸念事項です。これらの変化する構造体値型を効果的に使用して、状態または変更を維持する方法。

私の質問は、iOS アプリの MVVM 設計では、ビュー モデルはクラスまたは構造体である必要がありますか? ビューモデルはモデル/モデルのリストを保持し、これらのモデルインスタンスは時間の経過とともに変化する可能性があるため (たとえば、ビューモデルは Web サービスリクエストからより多くのモデルインスタンスを取得し、モデルの配列に追加します)、ビューコントローラーのビューモデルはどのように更新されますか?この変更。これは疑似例ですが、最初にいくつかの考慮事項と簡単な説明を示します。

  • ここではバインディングを使用していません。(RxSwiftなし)。
  • KVO はありません。委任または完了ハンドラーの設計を使用しています。

例:

  • ビューコントローラーにはビューモデルのインスタンスがあります。表示されると、ビューモデルにWebサービスからデータを取得するように依頼します。
  • ビュー モデルがサービスを起動し、完了ハンドラークロージャーで応答を取得する
  • このクロージャ ビュー モデルでは、いくつかのモデル インスタンスをモデルの配列に追加します。
  • View Model は、View Controller の完了ハンドラを呼び出して、サービス要求の成功またはエラーを通知します。
  • ビュー コントローラーは、ビュー モデルに対していくつかの検証を行い、それに応じて UI アクションを実行します。

モデルを見る:

ビューコントローラー:

上記のコードでは、ビュー モデルが応答を取得すると、その配列にデータが追加されますが、その変更がビュー コントローラーに渡されることはありません。これは、クロージャー内ではビュー コントローラーのモデルではなく更新されるビュー モデルのコピーであるためです。問題は、この変更がビュー コントローラーにどのように渡されるかです。

クロージャーから更新されたビューモデルインスタンスを返す必要があり、ビューコントローラーのクロージャー更新では、ビューモデルのインスタンスです。しかし、これもView Controllerの閉鎖のように機能しません.View Modelのコピーを更新しますか??

これにどのように対処する必要がありますか?1 つのオプションは、ビュー モデルをクラスにして、すべてを参照し、どこでも同じインスタンスを更新することです。しかし、ビューモデルとモデルでも同じことが起こり得るので、モデルもクラスになります。また、アプリの大部分はビュー コントローラーであるため、ビュー モデルと作成するモデルはすべてクラスです。したがって、ここでは値型の力を実際には使用していません。

助言がありますか?

0 投票する
3 に答える
6107 参照

ios - クラスと構造体のクロージャーでの Swift 可変構造体の動作が異なる

構造体変数 (S) を持つクラス (A) があります。このクラスの 1 つの関数で、構造体変数の変更関数を呼び出します。この関数はクロージャを取ります。このクロージャの本体は、構造体変数の name プロパティをチェックします。

Struct の変更関数は、あるクラス (B) の関数を順番に呼び出します。このクラスの関数は再びクロージャーを取ります。このクロージャの本体で、構造体を変更します。つまり、name プロパティを変更し、最初のクラスによって提供されたクロージャを呼び出します。

最初のクラス (A) クロージャーが構造体の name プロパティを検査している場所で呼び出されると、それは決して変更されません。

しかし、ステップ 2 で、クラス B の代わりに構造体 (C) を使用すると、クラス A のクロージャー構造体の内部が実際に変更されていることがわかります。以下はコードです:

なぜこの異なる動作。差別化要因は、viewModel に構造体を使用するか、クラスに使用するかであると考えました。ただし、ここでは、Networking がクラスであるか構造体であるかに依存し、ViewController または ViewModel から独立しています。誰でもこれを理解するのを手伝ってもらえますか?