問題タブ [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.
swift - Swift では、オブジェクトの作成直後にどのように関数を呼び出すことができますか?
プロトコルの拡張機能から提供される関数を介してstructs
JSON 辞書 ( ) から初期化するいくつかのオブジェクトがあります (「辞書/配列を使用して Codable に準拠するオブジェクトを初期化する」を参照)。[String : Any]
init
Decodable
基本的に、次のようなオブジェクトがあります。
ObjectModelB
の配列が含まれてObjectModelA
おり、変更された場合にのみ実際に設定したいプロパティもありarrayOfObjectModelAVal
ます。
didSet
onを使用できますarrayOfObjectModelAVal
が、それはプロパティへの将来の変更のみをキャッチしarrayOfObjectModelAVal
ます。問題は、Web サービスを使用して JSON データを取得し、ObjectModelB ( [[String : Any]]
) の配列を作成していることです。次のようにビルドします。
私のオブジェクトはcompactMap
クロージャー内に作成されinit
、didSet
.
init
また、 fromDecodable
プロトコル (クロージャー内のもの)によって提供される init を「オーバーライド」することはできません。これはtry? ObjectModelB(any: $0)
、オブジェクトが でありstruct
、これは継承ではなく、プロトコルによって提供されるイニシャライザーにすぎないためです。init
それ以外の場合は、オブジェクトの を「オーバーライド」してsuper.init
から、複雑なプロパティを更新するある種の変更関数を実行し、複雑なプロパティを作成しますprivate(set)
。
私が考えることができる他の唯一のオプションは、先ほど述べた変更関数を作成し、それをdidSet
whenarrayOfObjectModelAVal
変更の両方で呼び出してから、オブジェクトの初期化呼び出しを次のように更新することです。
しかし、今updateProperties
では誰でもいつでも呼び出すことができ (これは本当に負担が大きいため悪いことです)、開発者がその役割を忘れる可能性があるため、オブジェクトの配列を作成するときにも呼び出されるという保証はありませんforEach
。updateProperties
したがって、オブジェクトの初期化直後に関数を自動的に呼び出す方法が必要な理由。
swift - OOP型継承パターンを置き換えるSwift Structイディオム?
Rectangles で動作するプログラムがあるとしましょう (これは私の実際の問題の単純化された例です)。これを次のようにモデル化します。
有理化された長方形は、基本的に正の幅と高さを持つ長方形です。多くの操作 (拡大縮小、平行移動、結合、交差など) では、四角形が合理化されていることを保証すると便利です。init(...)
実際、不合理なロジックを作成できないように、合理化ロジックを にインターンすることもできます。しかし、少なくとも一時的に、おそらくドラッグ アンド ドロップ中の編集のために、不合理な構造をサポートしたい場合があります。
これを行うと、合理化ロジックを init() に入れると裏目に出てしまいます。
しかし、別の方法として、(ドラッグ アンド ドロップ サイトを除く) ほぼすべての場所にコードを散らかしてrationalized()
呼び出しを行うことです。何とか構造体と型でこれを行うことができるかどうかを判断しようとしています。
クラスを使用していた場合、Rectangle スーパークラスと RationalizedRectangle サブクラスを持つことができ、RationalizedRectangle が init をオーバーライドして作業を行います。次に、通常は RationalizedRectangles を使用して (必要に応じて型として指定することもできます)、Rectangle を使用してそれらを編集し、最後に RationalizedRectangle に変換することができます。
しかし、Swift 構造体は継承をサポートしていません。だから私は慣用的にこれを達成する方法に途方に暮れています。構造体に isRationalizing:Boolean を追加して分岐することもできますが、それは安っぽく見えます。
ここで機能する構造体ベースのイディオムはありますか?
json - Swift Decoder を使用して JSON 配列から属性を取得します
この呼び出しを使用して作成された JSON 配列があります。
次のコードを使用して、配列内の JSON オブジェクトから要素を取得して表示しようとしています。
コードはコンパイルされますが、実行すると出力に次のエラーが表示されます。
タイプ '__NSDictionaryM' (0x1063c34f8) の値を 'NSData' (0x1063c1090) にキャストできませんでした。2018-08-09 09:41:02.666713-0500 TruckMeterLogScanner[14259:1223764] タイプ '__NSDictionaryM' (0x1063c34f8) の値を 'NSData' (0x1063c1090) にキャストできませんでした。
まだ調査中ですが、何かヒントがあれば教えてください。
ios - 静的メソッドでプロパティ値を変更するには?
この単純なゲームには、2 人のファイターを戦わせることを目的とするクラス ファイターがあります。体力が 0 未満になると、ゲームに負けます。
戦うために、別の非静的メソッド攻撃 (..) によってサポートされた、1 人の戦闘機がゲームに勝つまで反復する静的メソッドの戦い (..) があります。
object Fighter のヘルスは、メソッドfight(...)とattack(...)を使用してゲーム中に2つのオブジェクトが戦うと変化するはずです。問題は、常に同じファイターのヘルスを出力し、ゲームが終了しないことです。問題がどこにあるのかわかりません